进行文件上传时,表单需要做的准备:
1)请求方式为POST
2)在表单中使用表单元素<input type="file" />
,则浏览器在解析表单时,会自动生成一个输入框和一个按钮,输入框可供用户填写本地文件的文件名和路径名,按钮可以让浏览器打开一个文件选择框供用户选择文件。
3)使用 multipart/form-data 的请求编码方式<form action="uploadServlet" method="post" enctype="multipart/form-data"> File: <input type="file" name="file" /> <input type="submit" value="Submit" /> </form>
4) 关于 enctype:
① application/x-www-form-urlencoded:表单enctype 属性的默认值。这种编码方案使用有限的字符集,当使用了非字母和数字时,必须用“%HH”代替(H 代表十六进制数字)。对于大容量的二进制数据或包含非ASCII 字符的文本来说,这种编码不能满足要求。
② multipart/form-data:form 中 enctype元素设定了该值后,表示表单以二进制传输数据。服务端
1)不能再使用request.getParameter()等方式获取请求信息,获取不到,因为请求的编码方式已经改为 multipart/form-data,以二进制的方式来提交请求信息。
2)可以使用输入流的方式来获取,但不建议这样做。
3)Apache 为我们提供了一个 commons-fileupload 组件来完成文件的上传操作。
如何使用commons-fileupload 组件来完成一个文件上传
1)环境搭建:加入 commons-fileupload-1.2.1.jar 和commons-io-2.0.jar
2 ) 基本思想:① commons-fileupload 可以解析请求,得到FileItem 对象组成的 List
② commons-fileupload 把所有的请求信息都解析为FileItem 对象,无论是一个一般的文本域还是一个文件域。
③ 可以调用 FileItem 的 isFormFiled() 方法来判断该FileItem 对象是一个表单域(true)或不是一个表单域(则是一个文本域)
④ 可以再进一步获取信息:if(item.isFormField){ String name = item.getFieldName(); String value = item.getString(); } if(!item.isFormField){ String fieldName = item.getFieldName(); String fileName = item.getName(); String contentType = item.getContentType(); boolean isInMemory = item.isInMemory(); long sizeInBytes = item.getSize(); InputStream uploadedStream = item.getInputStream(); ... uploadedStream.close(); }
如何得到
List<FileItem>
对象?//DiskFileItemFactory 工厂类 默认实现FileItemFactory接口 FileItemFactory factory = new DiskFileItemFactory(); //ServletFileUpload对象用于解析request,能从request中解析出装有FileItem对象的一个List ServletFileUpload upload = new ServletFileUpload(factory); List<FilItem> items = upload.parseRequest(request);
可以为文件的上传加入一些限制条件和其他的属性:
FileItemFactory factory = new DiskFileItemFactory(); //设置内存中最多可以存放的上传文件的大小,若超出则把文件写到一个临时文件夹中,以byte为单位 factory.setSizeThreshold(yourMaxMemorySize); //设置那个临时文件夹 factory.setRepository(yourTempDirectory); ServletFileUpload upload = new ServletFileUpload(factory); //设置上传文件的总的大小,也可以设置单个文件的大小 upload.setSizeMax(yourMaxRequestSize); List<FilItem> items = upload.parseRequest(request);