Java中,当表单含有文件上传时,提交数据的如何读取

来源:互联网 发布:中信证券 软件 编辑:程序博客网 时间:2024/05/18 03:31

当提交表单里包含文件上传的时候,即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示例代码:

[java] view plaincopyprint?
  1. // 判断enctype属性是否为multipart/form-data
  2. boolean isMultipart = ServletFileUpload.isMultipartContent(request);
  3. // Create a factory for disk-based file items
  4. DiskFileItemFactory factory = new DiskFileItemFactory();
  5. // 当上传文件太大时,因为虚拟机能使用的内存是有限的,所以此时要通过临时文件来实现上传文件的保存
  6. // 此方法是设置是否使用临时文件的临界值(单位:字节)
  7. factory.setSizeThreshold(yourMaxMemorySize);
  8. // 与上一个结合使用,设置临时文件的路径(绝对路径)
  9. factory.setRepository(yourTempDirectory);
  10. // Create a new file upload handler
  11. ServletFileUpload upload = new ServletFileUpload(factory);
  12. // 设置上传内容的大小限制(单位:字节)
  13. upload.setSizeMax(yourMaxRequestSize);
  14. // Parse the request
  15. List<?> items = upload.parseRequest(request);
  16. Iterator iter = items.iterator();
  17. while (iter.hasNext()) {
  18. FileItem item = (FileItem) iter.next();
  19. if (item.isFormField()) {
  20. //如果是普通表单字段
  21. String name = item.getFieldName();
  22. String value = item.getString();
  23. ...
  24. } else {
  25. //如果是文件字段
  26. String fieldName = item.getFieldName();
  27. String fileName = item.getName();
  28. String contentType = item.getContentType();
  29. boolean isInMemory = item.isInMemory();
  30. long sizeInBytes = item.getSize();
  31. ...
  32. // Process a file upload
  33. if (writeToFile) {
  34. File uploadedFile = new File(...);
  35. item.write(uploadedFile);
  36. } else {
  37. InputStream uploadedStream = item.getInputStream();
  38. ...
  39. uploadedStream.close();
  40. }
  41. }
  42. }


2. cos示例代码:

[java] view plaincopyprint?
  1. // 设置大小限制(单位:字节)
  2. final int permitedSize = 314572800;
  3. try {
  4. String type = "";
  5. String name = "";
  6. String originalFilename = "";
  7. String extension1 = "";
  8. String extension2 = "";
  9. String filename = "";
  10. //上传目录
  11. String strDirectory = "files";
  12. String uploadPath = request.getRealPath("//WEB-INF//"+strDirectory+"//");
  13. // 获取句柄
  14. MultipartRequest multipartRequest = new MultipartRequest(request, uploadPath,
  15. permitedSize, "ISO-8859-1",new DefaultFileRenamePolicy());
  16. // 取得文件
  17. Enumeration files = multipartRequest.getFileNames();
  18. // 取得文件详细信息
  19. while (files.hasMoreElements()) {
  20. name = (String)files.nextElement();
  21. type = multipartRequest.getContentType(name);
  22. filename = multipartRequest.getFilesystemName(name);
  23. originalFilename = multipartRequest.getOriginalFileName(name);
  24. File currentFile = multipartRequest.getFile(name);
  25. ...
  26. }
  27. // 取得其它非文件字段
  28. Enumeration params = multipartRequest.getParameterNames();
  29. while (params.hasMoreElements()) {
  30. String name = (String)params.nextElement();
  31. String value = multi.getParameter(name);
  32. ...
  33. }
  34. } catch (Exception exception) {
  35. response.sendError(response.SC_METHOD_NOT_ALLOWED);
  36. } finally {
  37. if (out != null) {out.close();}
  38. }


3. SmartUpload示例代码:

[java] view plaincopyprint?
  1. smartupload mysmartupload = new smartupload();
  2. mysmartupload.initialize(this.getServletConfig(), request, response);
  3. // 设置文件大小限制(单位:字节)
  4. mysmartupload.setMaxFileSize(10000000);
  5. // 设置总上传数据总大小(单位:字节)
  6. mysmartupload.setTotalMaxFileSize(20000000);
  7. // 设置允许的文件扩展名
  8. mysmartupload.setAllowedFilesList("jpg,png,gif,bmp,jpeg");
  9. // 设置不允许的文件扩展名
  10. mysmartupload.setDeniedFilesList("exe,bat,jsp,htm,html,,");
  11. try {
  12. mysmartupload.upload();
  13. } catch (smartuploadException e1) {
  14. e1.printStackTrace();
  15. }
  16. // 读取其它非文件上传字段
  17. com.jspsmart.upload.Request req = mysmartupload.getRequest();
  18. String title = req.getParameter("dest");
  19. // 保存文件
  20. for (int i =0; i < mysmartupload.getFiles().getCount(); i++) {
  21. com.jspsmart.upload.File file = mysmartupload.getFiles().getFile(i);
  22. if (file.isMissing())continue;
  23. try {
  24. file.saveAs("yourSavePath" + file.getFileName());
  25. } catch (smartuploadException e) {
  26. e.printStackTrace();
  27. }
  28. }  



原文:http://blog.csdn.net/lian_zhihui1984/article/details/6822201
原创粉丝点击