下载commons-fileupload.jar,commons-io.jar包
2. 后台处理
try {
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置缓冲区大小,这里是4kb
factory.setSizeThreshold(FILE_MAX_SIZE_TEMP);
// 设置临时文件夹
factory.setRepository(new File("c:\\temp"));
ServletFileUpload fu = new ServletFileUpload(factory);
// 设置最大文件大小
fu.setSizeMax(FILE_MAX_SIZE);
// 得到所有的文件,以及其它请求参数
List fileItems = fu.parseRequest(request);
// 构造接收上传文件列表
List fileList = new ArrayList();
// 处理上传文件fileItem
for (int i = 0; i < fileItems.size(); i++) {
FileItem fileItem = (FileItem) fileItems.get(i);
if (!fileItem.isFormField()) {// 文件域
// 过滤掉文件名(包含路径)为空或大小为0的文件
if (fileItem.getName() == null
|| fileItem.getName().equals("")
|| fileItem.getSize() == 0) {
continue;
} else {
fileList.add(fileItem);
}
}
}
for (int i = 0; i < fileList.size(); i++) {
FileItem fileItem = (FileItem) fileList.get(i);
// 文件全路径(本地文件路径)
String fileFullPath = fileItem.getName();
// 文件大小(单位字节)
long fileSize = fileItem.getSize();
// 文件ContentType(真实文件类型)
String contentType = fileItem.getContentType()
// 文件名称(包括扩展名)
String fileFullName = fileFullPath.substring(fileFullPath.lastIndexOf("/") + 1);
// 文件名称(不含扩展名)
String fileTitle = fileFullName.substring(0,fileFullName.lastIndexOf("."));
// 文件扩展名
String fileExt = fileFullName.substring(fileFullName.lastIndexOf(".")+1);
// 上传文件(保存文件到服务器磁盘)
fileItem.write(new File(storePath));
}
} catch (SizeLimitExceededException se) {
// 文件大小超过限定大小异常
} catch (Exception ex) {
ex.printStackTrace();
}
说明:
(1) 文件合法性检验
有两种方法,一种是根据文件扩展名来检验,这种方法比较简单,但可能不准确;另一种方式是根据ContentType来检验,这种方式比较准确,但稍微麻烦些;
(2) 文件的存贮
上传文件的名称可能包含非英文字符,不便于处理。一般根据一定规则生成一个全英文字符的文件名,用来作为存贮文件名,文件原始名称只在显示时用;
一般上传的文件需要分目录存贮,最自然的方式是根据上传时间年月日来建目录存贮,具体情况需要根据实际文件数量来考虑,最保险的方式是先按年建一个目录,再按月份建一个目录,再按日建一个目录;因为操作系统对统一目录下文件夹个数都有限制,因此需要分级建立目录;
(3) 文件路径的分割符最好用File.separator,适应各种操作系统
3. 其他
(1) 采用DiskFileItemFactory来上传文件时,会指定临时文件夹,处理上传文件前会先保存到临时文件夹,因此会产生一些临时文件。commons-fileupload提供了一个监听器可以在上传完毕后自动删除临时文件,具体配置如下(web.xml):
<web-app>
...
<listener>
<listener-class>
org.apache.commons.fileupload.servlet.FileCleanerCleanup
</listener-class>
</listener>
...
</web-app>
commons-fileupload还提供了临时文件处理类,需要在创建DiskFileItemFactory时创建。
(2) commons-fileupload还提供了一个上传进度监听器ProgressListener,可以实时获取文件上传的进度,具体请参考
http://commons.apache.org/fileupload/using.html