JAVA上传文件 DiskFileUpload组件

转自:http://feng88724.iteye.com/blog/322731

 

commons fileupload 是Apache commons项目的一部分,FileUpload 使你很容易在servlet及web 应用中提供一个鲁棒的、高性能的文件上特性。FileUpload按照RFC 1867 ( "Form-based File Upload in HTML")处理HTTP请求。即,如果HTTP request 以 POST方法提交,并且content type 设置为"multipart/form-data",那么FileUpload可以处理该请求,在web应用中提供文件上载的功能。其使用方法见commons fileupload的相关文档。 

在把FileUpload与struts结合(jsp + uploadactiono)使用过程中发现,如果在action mapping配置中不指定formbean,文件上传过程正常。如果指定了formbean,文件上传不正常,取不到文件。以下是几个文件片断: 

Java代码   收藏代码
  1. upload.jsp   
  2.   
  3. **form action="uploadaction.do?method=uploadByFileUpload" method="post" enctype="multipart/form-data" ** **input type="file" name="uploadfile"** **/form**UploadAction.java public ActionForward uploadByFileUpload(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { ......   
  4. String dir =   
  5. request.getSession().getServletContext().getRealPath(   
  6. "/");   
  7. DiskFileUpload fu= new DiskFileUpload();   
  8.   
  9. fu.setSizeMax( UPLOAD_MAXSIZE);   
  10. fu.setSizeThreshold( MAX_DATA_IN_MEM);   
  11. fu.setRepositoryPath( System.getProperty("java.io.tmpdir"));   
  12.   
  13. try {   
  14. List fileItem= fu.parseRequest( request);   
  15. Iterator it= fileItem.iterator();   
  16. while( it.hasNext()){   
  17. FileItem item= (FileItem)it.next();   
  18. if( !item.isFormField() && null!= item.getName() &&   
  19. 0!= item.getName().trim().length()){   
  20. String clientPath = item.getName();   
  21. String fileName = new File(clientPath).getName();   
  22.   
  23. File destDir = new File( dir);   
  24.   
  25. File file = new File(destDir, fileName);   
  26. item.write( file);   
  27. map.put( item.getFieldName(),   
  28. dir+ File.separator+ fileName);   
  29.   
  30.   
  31. }   
  32. }   
  33. catch (Exception e) {   
  34. String str= "文件上载异常,错误信息:"+ e.getMessage();   
  35. System.out.println(str);   
  36. throw new Exception( str, e);   
  37. }   
  38.   
  39. ......   
  40. }   
  41.   
  42. struts-config.xml   
  43.   
  44. name="TestForm"   
  45. type="UploadAction"   
  46. parameter="method" >   


现象:在struts-config.xml文件中,如果指定了formbean——name="TestForm" ,则文件无法正确上传,UploadAction中的fu.parseRequest( request)方法返回值为null;如果去掉了说明formbean的name属性,则文件可以正常上传。 

原因:struts的RequestProccessor.process已经包含了处理文件上传的方法。如果在action配置中设置了formbean ,那么在你自己的action处理request之前,struts已经在RequestProccessor.populate方法中处理了request,因此,在自己的action中就取不到上传的文件了。 

处理:如果要自己在action中处理文件上传工作,那么就不要在配置文件中配置formbean。 

其他选择:如果仍需使用formbean,那么可以使用struts内置的文件上传功能。具体使用方法见struts的相关文档,以及struts的upload例子。以下是几个文件片断: 

upload.jsp 
基本同上,修改form标签的action属性 
Java代码   收藏代码
  1. UploadAction.java   
  2. public ActionForward uploadByStruts(ActionMapping mapping,   
  3. ActionForm form,   
  4. HttpServletRequest request,   
  5. HttpServletResponse response)   
  6. throws Exception {   
  7. ActionErrors errs= new ActionErrors();   
  8.   
  9. if (form != null){   
  10. DynaActionForm theForm = (DynaActionForm)form;   
  11. FormFile file = (FormFile)theForm.get("uploadfile");   
  12. try{   
  13. String fileName= file.getFileName();   
  14. if ("".equals(fileName)) {return null;}   
  15. InputStream stream = file.getInputStream();   
  16.   
  17. String dir =   
  18. request.getSession().getServletContext().getRealPath(   
  19. "/");   
  20. OutputStream bos = new FileOutputStream(dir+"/"+fileName);   
  21. int bytesRead = 0;   
  22. byte[] buffer = new byte[8192];   
  23. while ((bytesRead = stream.read(buffer, 08192)) != -1) {   
  24. bos.write(buffer, 0, bytesRead);   
  25. }   
  26. bos.close();   
  27. stream.close();   
  28. }catch (FileNotFoundException fnfe) {   
  29. ...   
  30. }catch (IOException ioe) {   
  31. ...   
  32. }catch (NullPointerException e){   
  33. ...   
  34. }   
  35.   
  36. }else{   
  37. ...   
  38. }   
  39.   
  40. if (!errs.isEmpty()){   
  41. saveErrors( request, errs);   
  42. }   
  43.   
  44. return mapping.findForward( "success");   
  45.   
  46. }   
  47.   
  48.   
  49. struts-config.xml   
  50.   
  51. **form-bean name="TestForm" type="org.apache.struts.action.DynaActionForm"**   
  52. form-property name="uploadfile" type="org.apache.struts.upload.FormFile" /**  
  53. /form-bean**  
  54.  
  55. **action path="/uploadaction"  
  56. name="TestForm" **!--指定formbean--**  
  57. type="UploadAction"  
  58. parameter="method" **  
  59. **forward name="success" path="/success.jsp" /**  
  60. **/action**   
  61.   
  62. **controller maxFileSize="2M" /**   

注意,使用struts自带的文件上传功能,最带文件尺寸限制用来配置。另为struts对文件上载功能提供了两种处理实现:org.apache.struts.upload.CommonsMultipartRequestHandler 和 org.apache.struts.upload.DiskMultipartRequestHandler。struts默认的是前者,如果要使用后者,需在中配置,配置样例如下。而且,DiskMultipartRequestHandler是使用commons uploadload实现的。

你可能感兴趣的:(fileupload)