当提交表单里包含文件上传的时候,即Form的enctype属性值为multipart/form-data时,后台是无法像普通表单那样通过request.getParameter来获取用户提交的数据的。(说实话,我经常因为忘记这个问题而浪费好多调查时间。)
这时候,当然可以通过解析提交到服务器的数据流来得到数据了,但是这样不但麻烦而且容易出错。
最好的方式是使用第三方的jar包获取数据,这方面有很多现成的成熟优秀的jar包。最常用的时以下三个:
O'Reilly的cos: http://www.servlets.com/cos/index.html
jspsmart的SmartUpload:官方不提供下载了,google搜吧。
其中,据评测效率最高的是COS,最慢的是SmartUpload;最常用的是common-upload;文件太大时SmartUpland会崩溃。
1. common-upload示例代码:
// 判断enctype属性是否为multipart/form-data
booleanisMultipart = ServletFileUpload.isMultipartContent(request);
// Create a factory for disk-based file items
DiskFileItemFactory factory = newDiskFileItemFactory();
// 当上传文件太大时,因为虚拟机能使用的内存是有限的,所以此时要通过临时文件来实现上传文件的保存
// 此方法是设置是否使用临时文件的临界值(单位:字节)
factory.setSizeThreshold(yourMaxMemorySize);
// 与上一个结合使用,设置临时文件的路径(绝对路径)
factory.setRepository(yourTempDirectory);
// Create a new file upload handler
ServletFileUpload upload = newServletFileUpload(factory);
// 设置上传内容的大小限制(单位:字节)
upload.setSizeMax(yourMaxRequestSize);
// Parse the request
List> items = upload.parseRequest(request);
Iterator iter = items.iterator();
while(iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if(item.isFormField()) {
//如果是普通表单字段
String name =