利用commons-fileupoad上传文件

1. 准备工作

下载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

你可能感兴趣的:(exception,String,list,File,服务器,扩展)