使用Apache FileUpload

3月 24th, 2011 2,336 留下评论 阅读评论

用Java写Web程序,最大的好处就是几乎所有的功能都能找到强大的第三方类库来帮你实现。Apache的commons-fileupload是不错的上传文件的类库,实习中恰好又用上了,很幸运地曾经用fileupload写过程序,不过时间久了难免遗忘,写一篇文章保存着以后自己看也好。

在Web页面中处理上传文件的form表单,有2个值得注意的地方:

  1. form表单需要有属性enctype=”multipart/form-data”,而且method必须为post
  2. 当form使用了以上属性后,常用的HttpServletRequest.getParameter(“fieldname”)方法来获取表单中的字段值就失效了

编程的时候这2点很容易忘记,忘了第一点文件无法上传,fileupload中的判断方法ServletFileUpload.isMultipartContent()就会返回false。忘了第二点就更麻烦,显而易见的程序就跑不出来了,往往让人很郁闷。

这样就可以使用fileupload来处理文件上传了,先初始化2个类DiskFileItemFactory和ServletFileUpload

1
2
3
4
5
6
7
8
9
10
11
"新建一个Factory"
DiskFileItemFactory factory = new DiskFileItemFactory();
"设置放置上传临时文件的文件夹"
factory.setRepository(new File("临时文件夹"));
"设置上传文件放在内存中的临界大小,大于临界值则会以临时文件的形式存在临时文件夹中,默认值10K"
factory.setSizeThreshold(10 * 1024);
 
"新建一个ServletFileUpload,基于Servlet的Web程序嘛"
ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
"设置上传文件最大size,10M是默认值"
servletFileUpload.setSizeMax(10 * 1024 * 1024);

然后就可以开始处理request数据,读取HttpServletRequest无法读取的表单字段数据和保存上传的文件了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
HttpServletRequest request;
if(ServletFileUpload.isMultipartContent(request)){
    List<FileItem> items = (List<FileItem>)servletFileUpload.parseRequest(request);
    for(FileItem item : items) {
        if (item.isFormField()) { "form中普通的字段"
            String fieldName = item.getFieldName();
            String value = item.getString();
            String value = item.getString("UTF-8");
        }
        else{ "form中的file项,即上传文件的内容"
            long fileSize = item.getSize();
            String fileName = item.getName();
            "Tip:一般可以用 时间戳、文件大小、随机数和源文件名 这几个参数来动态生成唯一的新文件名"
            item.write(new File("新的文件位置"));
            item.delete();  "用来释放临时文件"
        }
    }
}

很简单,很方便,apache威武,开源威武!

Categories: Java 标签:
  1. 3月 25th, 2011 20:17

    都是代码,看不懂啊

    • 这个技术性文章当然是需要代码的了……有需要的人必然是能看懂的