日期:2014-05-16 浏览次数:20477 次
关于JSP 文件上传的基础和原理在系列一中有介绍到。 这里介绍一个很流行的组件commons fileupload,用来加速文件上传的开发。
官方的介绍是: 让添加强壮,高性能的文件到你的servlet和Web应用程序变得容易。
官方项目地址:
http://commons.apache.org/proper/commons-fileupload/
FileUpload分析request 里的数据, 生成一些独立的上传items. 每一个item都继承自 FileItem 这个接口。
1. 可以到 http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi 这个地址下载最新的版本。
2. 另外还需要下载 commons-io的 jar 包,下载地址:
http://commons.apache.org/proper/commons-fileupload/dependencies.html
在servlet 和portlet中都可以使用FileUpload, 以下以servlet的使用来介绍
首先,需要判断request 是否是文件上传的request.
系列一也有提,文件上传的form 必须设置成如下:
<form method="POST" enctype="multipart/form-data" action="fileUploadServlet">
这里有提供一个方法判断request 是否是正确的类型
// Check that we have a file upload request boolean isMultipart = ServletFileUpload.isMultipartContent(request);
例如这里, 如果form 中移除enctype="multipart/form-data", 返回值就是false 了。
最简单的状况
最简单的使用场景如下:
1. 如果上传的文件足够小的话应该保存在内存中
2. 大的文件应该写到临时文件中
3. 超大的文件上传请求应该不被允许
4. 内存中的文件最大值,允许上传的文件最大尺寸和临时文件目录的接收默认的设置。
看个实例:
// Create a factory for disk-based file items FileItemFactory factory = new DiskFileItemFactory(); // Configure a repository (to ensure a secure temp location is used) ServletContext servletContext = this.getServletConfig().getServletContext(); File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir"); factory.setRepository(repository); // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // Parse the request List<FileItem> items = upload.parseRequest(request);
更多的控制
也可以进行更多的设置, 看例子
// Create a factory for disk-based file items DiskFileItemFactory factory = new DiskFileItemFactory(); // Set factory constraints factory.setSizeThreshold(yourMaxMemorySize); factory.setRepository(yourTempDirectory); // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // Set overall request size constraint upload.setSizeMax(yourMaxRequestSize); // Parse the request List<FileItem> items = upload.parseRequest(request);
这里设置了最大内存大小,临时文件路径和文件最大值。
设置方式也可以这样:
DiskFileItemFactory factory = new DiskFileItemFactory(yourMaxMemorySize, yourTempDirectory);
需要再提一下的是: FileUpload 不仅会把