一,实现文件上传和文件下载使用了第三组件
commons-fileupLoad-1.3.2-bin.zip点击打开链接
commons-io-2.5-bin.zip点击打开链接
将这两个压缩包解压,得到的commons-fileupLoad-1.3.2.jar 和 commons-io-2.5.jar 放到当前应用项目的WEB-INF\lib的目录下
二,文件上传
1.上传文件时最好使用Post方法提交表单。表单中添加 ENCTYPE="multipart/form-data"
例如:
<form method="post" action="FileUpLoad" ENCTYPE="multipart/form-data" >
2.实现文件上传的Servlet:
步骤:
(1)创建一个DiskFileItemFactory工厂,设置好文件的保存目录和临时文件保存目录
(2)使用工厂得到ServletFileUpload解析器,解析器设置好监听器和文件名编码之后就可以进行文件解析了。
(3).文件解析首先判断是不是文件上传,如果不是,则直接返回;如果是,再次判断是普通输入项数据还是文件数据,是普通输入项数据则按普通方式进行解析;是文件数据则进行文件解析。(根据输入输出流进行上传)
注意:
(1)为保证上传文件的安全性,将上传文件放在WEB-INF的目录下
(2)限制上传文件的大小,同时设置工厂的缓冲区的大小,当上传的文件大小大于缓冲区的大小时,就会产生一个临时文件存放到指定的临时目录
//设置上传单个文件的大小的最大值,目前设置为1MB
upload.setFileSizeMax(1024*1024);
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置工厂的缓冲区的大小,当上传的文件大小大于缓冲区的大小时,就会产生一个临时文件存放到指定的临时目录,不指定大小,缓冲区大小默认10kb
factory.setSizeThreshold(1024*100);
(3)对于相同文件上传多次出现相同文件名时,可以
//得到文件的保存名称
String saveFilename=makeFileName(filename);
private String makeFileName(String filename) {
//为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名
return UUID.randomUUID().toString() + "_" + filename;
}
(4)限制文件上传的类型,判断文件的后缀名是否合法。
(5)
当两个上传框中只有一个选择了上传文件而直接点击了提交:
if(filename == null || filename.trim().equals("")){
continue;//如果某个框中没有选择上传的文件则跳出本次循环,继续下一次循环
}
(6)
监听文件上传进度
upload.setProgressListener