Java中,当表单含有文件上传时,提交数据的如何读取
来源:互联网 发布:小蓓网络 编辑:程序博客网 时间:2024/05/28 11:29
当提交表单里包含文件上传的时候,即Form的enctype属性值为multipart/form-data时,后台是无法像普通表单那样通过request.getParameter来获取用户提交的数据的。
这时候,当然可以通过解析提交到服务器的数据流来得到数据了,但是这样不但麻烦而且容易出错。
最好的方式是使用第三方的jar包获取数据,这方面有很多现成的成熟优秀的jar包。最常用的时以下三个:
apache的commons-fileupload : http://commons.apache.org/fileupload/
O'Reilly的cos: http://www.servlets.com/cos/index.html
jspsmart的SmartUpload:官方不提供下载了,google搜吧。
其中,据评测效率最高的是COS,最慢的是SmartUpload;最常用的是common-upload;文件太大时SmartUpland会崩溃。
1. common-upload示例代码:
-
- boolean isMultipart = ServletFileUpload.isMultipartContent(request);
-
-
- DiskFileItemFactory factory = new DiskFileItemFactory();
-
-
-
- factory.setSizeThreshold(yourMaxMemorySize);
-
-
- factory.setRepository(yourTempDirectory);
-
-
- ServletFileUpload upload = new ServletFileUpload(factory);
-
-
- upload.setSizeMax(yourMaxRequestSize);
-
-
- List<?> items = upload.parseRequest(request);
-
- Iterator iter = items.iterator();
- while (iter.hasNext()) {
- FileItem item = (FileItem) iter.next();
-
- if (item.isFormField()) {
-
- String name = item.getFieldName();
- String value = item.getString();
- ...
- } else {
-
- String fieldName = item.getFieldName();
- String fileName = item.getName();
- String contentType = item.getContentType();
- boolean isInMemory = item.isInMemory();
- long sizeInBytes = item.getSize();
- ...
-
-
- if (writeToFile) {
- File uploadedFile = new File(...);
- item.write(uploadedFile);
- } else {
- InputStream uploadedStream = item.getInputStream();
- ...
- uploadedStream.close();
- }
- }
- }
2. cos示例代码:
-
- final int permitedSize = 314572800;
-
- try {
- String type = "";
- String name = "";
- String originalFilename = "";
- String extension1 = "";
- String extension2 = "";
- String filename = "";
-
-
- String strDirectory = "files";
- String uploadPath = request.getRealPath("//WEB-INF//"+strDirectory+"//");
-
-
- MultipartRequest multipartRequest = new MultipartRequest(request, uploadPath,
- permitedSize, "ISO-8859-1", new DefaultFileRenamePolicy());
-
-
- Enumeration files = multipartRequest.getFileNames();
-
-
- while (files.hasMoreElements()) {
- name = (String)files.nextElement();
- type = multipartRequest.getContentType(name);
- filename = multipartRequest.getFilesystemName(name);
- originalFilename = multipartRequest.getOriginalFileName(name);
- File currentFile = multipartRequest.getFile(name);
- ...
- }
-
-
- Enumeration params = multipartRequest.getParameterNames();
-
- while (params.hasMoreElements()) {
- String name = (String)params.nextElement();
- String value = multi.getParameter(name);
- ...
- }
- } catch (Exception exception) {
- response.sendError(response.SC_METHOD_NOT_ALLOWED);
- } finally {
- if (out != null) {out.close();}
- }
3. SmartUpload示例代码:
- smartupload mysmartupload = new smartupload();
- mysmartupload.initialize(this.getServletConfig(), request, response);
-
- mysmartupload.setMaxFileSize(10000000);
-
- mysmartupload.setTotalMaxFileSize(20000000);
-
- mysmartupload.setAllowedFilesList("jpg,png,gif,bmp,jpeg");
-
- mysmartupload.setDeniedFilesList("exe,bat,jsp,htm,html,,");
-
- try {
- mysmartupload.upload();
- } catch (smartuploadException e1) {
- e1.printStackTrace();
- }
-
-
- com.jspsmart.upload.Request req = mysmartupload.getRequest();
- String title = req.getParameter("dest");
-
-
- for (int i = 0; i < mysmartupload.getFiles().getCount(); i++) {
- com.jspsmart.upload.File file = mysmartupload.getFiles().getFile(i);
-
- if (file.isMissing()) continue;
-
- try {
- file.saveAs("yourSavePath" + file.getFileName());
- } catch (smartuploadException e) {
- e.printStackTrace();
- }
- }
0 0