数据库:MySQL

开发技术:JSP + Servlet 2.5

第三方的上传组件:
  commons-fileupload
  connons-io


上传页面
1、form表单需要增加:enctype="multipart/form-data" 以字节流形式
2、form表单里面增加上传组件:input="file"
3、取消上传:<button onclick="javascript:window.opener == null;window.close();">取消上传</button>

<form id="form1" method="post" action="upload" enctype="multipart/form-data">
  <table>
    <tr>
<td width="25%" align="right">上传文件:</td>
<td><input id="file1" type="file" NAME="file1" style="width: 300px;"></td>
</tr>
<tr align="center" valign="middle">
<td height="60" colspan="2">
<input type="submit" id="BtnOK" value="确认上传">
<button onclick="javascript:window.opener == null;window.close();">取消上传</button>
</td>
</tr>
<tr align="center" valign="middle">
测试非表单控件的值接收:<td height="60" colspan="2"><input type="text" name="possess" value="非提交控件的值"></td>
</tr>
  </table>
</form>

代码:
工具类 MutiFileUpload.java 对fileupload组件进行简单封装

import java.io.UnsupportedEncodingException;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload; /**
* 当读取上传表单的各部分时会用到该encoding,如果没有指定
* encoding * 则使用系统缺省的encoding。建议在这里设置成utf-8,并把jsp
* 的charset也设置成utf-8,否则可能会出现乱码。
*
*/
@SuppressWarnings("unchecked")
public class MutiFileUpload{   public Map<String,String> parameters ;    //保存form表单域中非上传控件的值
public Map<String,FileItem> files;      //保存上传的文件

  //将文件保存在内存还是磁盘临时文件夹的默认临界值,值为10240,即10kb
private int sizeThreshold = DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD; private long sizeMax = 1024 * 1024 * 20 ;   //上传文件的大小限制;
private String encoding = "UTF-8";     //字符编码,当读取上传表单的各部分时会用到该encoding

  // 以上属性的 get/set 方法
public String getEncoding() {
return encoding;
} public void setEncoding(String encoding) {
this.encoding = encoding;
} public long getSizeMax() {
return sizeMax;
} public void setSizeMax(long sizeMax) {
this.sizeMax = sizeMax;
} public int getSizeThreshold() {
return sizeThreshold;
} public void setSizeThreshold(int sizeThreshold) {
this.sizeThreshold = sizeThreshold;
}
  
   // 解析请求,这个方法很重要
public void parse(HttpServletRequest request){

     //保存数据的2个Map初始化
parameters = new HashMap<String,String>();
files = new HashMap<String,FileItem>(); DiskFileItemFactory factory = new DiskFileItemFactory(); //设置临界值约束
factory.setSizeThreshold(sizeThreshold); ServletFileUpload upload = new ServletFileUpload(factory); upload.setSizeMax(sizeMax);
upload.setHeaderEncoding(encoding); try { List items = upload.parseRequest(request);
Iterator iterator = items.iterator();
while(iterator.hasNext()){ FileItem item = (FileItem)iterator.next();
if(item.isFormField()){
String fieldName = item.getFieldName();
String value = new String(item.getString(encoding));
parameters.put(fieldName, value); }else{
String fieldName = item.getFieldName();
files.put(fieldName, item);
}
} } catch (FileUploadException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} /** 得到上传文件的文件名
* @param item
* @return
*/
public String getFileName(FileItem item){ String fileName = item.getName();
fileName = replace(fileName,"\\","/");
fileName = fileName.substring(fileName.lastIndexOf("/")+1);
return fileName; } /**字符串替换
* @param source
* @param oldString
* @param newString
* @return
*/
public static String replace(String source, String oldString, String newString) { StringBuffer output = new StringBuffer();
int lengthOfSource = source.length();
int lengthOfOld = oldString.length();
int posStart = 0;
int pos; while ((pos = source.indexOf(oldString, posStart)) >= 0) { output.append(source.substring(posStart, pos));
output.append(newString);
posStart = pos + lengthOfOld;
} if (posStart < lengthOfSource) {
output.append(source.substring(posStart));
} return output.toString();
}
}

上传Servlet,doGet方法请求doPost。在doPost方法中编写如下代码:

    public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { DBUtils db = new DBUtils(); MutiFileUpload fileUpload = new MutiFileUpload();
fileUpload.parse(request);

     //这里是打印非上传组件的值,查看是否能够正常接收
//System.out.println( fileUpload.parameters.get("possess") ); Iterator<FileItem> iterator = fileUpload.files.values().iterator();
while(iterator.hasNext()){ FileItem item = iterator.next();
  
String fileName = fileUpload.getFileName(item);
if( fileName != null && !fileName.equals("")){
//获取服务器的路径
String serverPath = request.getSession().getServletContext().getRealPath("");
   //对上传文件重新命名
String rename = getReName(fileName);
File file = new File( serverPath+"/upload/"+rename); try {
if( !file.isDirectory()){
//上传成功后做数据库操作
item.write(file); //数据库操作,这里没有考虑效率,如果是多文件上传,可以考虑SQL的批处理
db.saveOrUpdateOrDel("insert into uploadfile(realname,rename_) values(?,?)",
new Object[]{fileName ,rename });
}
} catch (Exception e) {
e.printStackTrace();
//将上传的文件删除
if( file.exists()) file.delete();
}
} } } /**
* 以服务器当前时间为为上传文件重新命名
* @param fileName
* @return 新文件名
*/
private String getReName(String fileName){
int begin = fileName.lastIndexOf(".");
String extend = fileName.substring(begin, fileName.length());
return System.currentTimeMillis() + extend;
}

显示文件下载列表Servlet ,实体类就不再发了,可以在最下面按照SQL语句写

    public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { DBUtils db = new DBUtils();
List<UploadFile> ufs = db.queryForObject("select * from uploadfile", null, UploadFile.class);
request.setAttribute("filelist", ufs);
request.getRequestDispatcher("filelist.jsp").forward(request,response);
}

显示文件下载列表页面

╮(╯▽╰)╭  循环部分发出来就行了,这个filelist.jsp页面本来就这么一点东西

<c:forEach items="${filelist}" var="uf">
${uf.realname }&nbsp;&nbsp;&nbsp;<a href="down?re=${uf.rename_}&real=${uf.realname}">下载</a><br>
</c:forEach>

文件下载Servlet

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { //获取下载文件的名字
String re = request.getParameter("re");
//获取下载文件的真实名字
String real = request.getParameter("real"); //获取服务器路径
String serverPath = request.getSession().getServletContext().getRealPath("");
File f = new File( serverPath+"/upload/"+re); if( f.exists() ){
FileInputStream fis = new FileInputStream(f);
//手动转码,示例中是GET请求,要么手动转码,要么在过滤器中进行GET请求处理,当然能在服务器直接配置get请求编码就一劳永逸了
String filename = new String(real.getBytes("ISO8859-1"),"UTF-8");
byte[] b = new byte[fis.available()];
fis.read(b);
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition","attachment; filename="+filename );
//获取响应报文输出流对象
ServletOutputStream out =response.getOutputStream();
out.write(b);
out.flush();
out.close();
} }

MySQL 数据库部分

SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0; -- ----------------------------
-- Table structure for `uploadfile`
-- ----------------------------
DROP TABLE IF EXISTS `uploadfile`;
CREATE TABLE `uploadfile` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`realname` varchar(255) NOT NULL COMMENT '上传前的文件名字',
`rename_` varchar(255) NOT NULL COMMENT '重新命名',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; SET FOREIGN_KEY_CHECKS = 1;

文件上传下载:commons-fileupload + Servlet 2.5的更多相关文章

  1. Servlet文件上传下载

    今天我们来学习Servlet文件上传下载 Servlet文件上传主要是使用了ServletInputStream读取流的方法,其读取方法与普通的文件流相同. 一.文件上传相关原理 第一步,构建一个up ...

  2. jsp+servlet实现文件上传下载

    相关素材下载 01.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  3. SpringMVC文件上传下载

    在Spring MVC的基础框架搭建起来后,我们测试了spring mvc中的返回值类型,如果你还没有搭建好springmvc的架构请参考博文->http://www.cnblogs.com/q ...

  4. JavaWeb实现文件上传下载功能实例解析

    转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...

  5. java web 文件上传下载

    文件上传下载案例: 首先是此案例工程的目录结构:

  6. 2013第38周日Java文件上传下载收集思考

    2013第38周日Java文件上传&下载收集思考 感觉文件上传及下载操作很常用,之前简单搜集过一些东西,没有及时学习总结,现在基本没啥印象了,今天就再次学习下,记录下自己目前知识背景下对该类问 ...

  7. JavaWeb 文件 上传 下载

    文件上传下载对于一个网站来说,重要性不言而喻.今天来分享一个JavaWeb方式实现的文件上传下载的小例子. 项目依赖 项目目录 工作流程 文件上传 表单处的设置 服务器端 上传功能的实现 upload ...

  8. springmvc文件上传下载简单实现案例(ssm框架使用)

    springmvc文件上传下载实现起来非常简单,此springmvc上传下载案例适合已经搭建好的ssm框架(spring+springmvc+mybatis)使用,ssm框架项目的搭建我相信你们已经搭 ...

  9. JavaWeb 文件上传下载

    1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端,从服务器端下载文件到本地的过程.例如目前网站需要上传头像.上传下载图片或网盘等功能都是利用文件上传下 ...

随机推荐

  1. JNI之Hello World!

    基本流程: 1. 创建一个类(HelloWorld.java)2. 使用 javac 编译该类3. 利用 javah -jni 产生头文件4. 用本地代码实现头文件中定义的方法5. Run 备注:在一 ...

  2. Metesploit使用随笔

    平时在工作中真正用到metesploit机会不多,偶尔也会用来做漏洞验证,但是每次使用的时候都需要花点时间回忆一下具体是怎么用的,因此索性记下来方便自己,以使用Nessus扫描YS的某个硬件设备发现的 ...

  3. 启动、关闭tomcat脚本

    #[root@node1 ~]# vim /etc/init.d/tomcat #!/bin/bash # Init file for Tomcat server daemon # # chkconf ...

  4. Makefile的制作

    一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因 ...

  5. Webpack安装和配置

    一.安装和配置webpack 1.全局安装webpack 这样就安装好了webpack,可以再全局通过webpack -v来查看是否安装成功. 2.先创建项目目录结构,根目录是mywebpack.进入 ...

  6. prometheus的坑

    prometheus是一个用于监控k8s集群状态的工具.今天在主机上配置这个东西,遇到了一个坑,调查了一段时间才解决,记之. 首先,根据网上的教程,利用helm安装这个东西很方便,只要三条指令(ref ...

  7. ajax不运行success回调而是运行error回调

    调试代码遇到一个问题,就是前台运行删除操作后,controller返回数据,但前台接收时,ajax不运行success回调,总是弹出失败的对话框.接收数据类型是json. 先看看我的前台代码. if ...

  8. 深入浅出 消息队列 ActiveMQ (转)

    启动成功就可以访问管理员界面:http://localhost:8161/admin,默认用户名和密码admin/admin.如果你想修改用户名和密码的话,在conf/jetty-realm.prop ...

  9. apache添加mod_limitipconn限制单个ip并发连接数

    一.基本 官网:http://dominia.org/djao/limitipconn2.html 二.安装 1.下载#wget http://dominia.org/djao/limit/mod_l ...

  10. AbstractQueuedSynchronizer源码分析

    AbstractQueuedSynchronizer源码分析 前提 AQS(java.util.concurrent.locks.AbstractQueuedSynchronizer)是并发编程大师D ...