struts2上傳文件

原文連接:http://www.faceye.net/search/143092.htmlhtml

轉自:web

1、struts2上傳單個文件apache

第一步:確保在WEB-INF/lib在commons-fileupload-x.x.x.jar、commons-io-x.x.x.jar兩個jar文件。這兩個文件能夠從struts2下載文件中的lib中找到,或者到http://commons.apache.org/下載。數組

第二步:把form表的enctype設置爲:"multipart/form-data",method設置成"post"以下:瀏覽器

  1. <form enctype="multipart/form-data" action="${pageContext.request.contextPath}/xxx.action" method="post">  
  2.   <input  type="file" name="uploadFile">  
  3. </form> 
第三步:在Action類中添加如下屬性,action類的代碼以下所示:
  1. import org.apache.commons.io.FileUtils;  
  2. import org.apache.struts2.ServletActionContext;  
  3. import com.opensymphony.xwork2.ActionContext;  
  4.   
  5. public class TestAction {  
  6.     private File uploadFile; // 獲得上傳的文件,此屬性對應於表單中文件字段的名稱  
  7.     //下面的這兩個屬性的命名必須遵照上定的規則,即爲"表單中文件字段的名稱" + "相應的後綴"  
  8.     private String uploadFileContentType; // 獲得上傳的文件的數據類型,  
  9.     private String uploadFileFileName; // 獲得上傳的文件的名稱  
  10.   
  11.     public File getUploadFile() {  
  12.         return uploadFile;  
  13.     }  
  14.   
  15.     public void setUploadFile(File uploadFile) {  
  16.         this.uploadFile = uploadFile;  
  17.     }  
  18.   
  19.     public String getUploadFileContentType() {  
  20.         return uploadFileContentType;  
  21.     }  
  22.   
  23.     public void setUploadFileContentType(String uploadFileContentType) {  
  24.         this.uploadFileContentType = uploadFileContentType;  
  25.     }  
  26.   
  27.     public String getUploadFileFileName() {  
  28.         return uploadFileFileName;  
  29.     }  
  30.   
  31.     public void setUploadFileFileName(String uploadFileFileName) {  
  32.         this.uploadFileFileName = uploadFileFileName;  
  33.     }  
  34.   
  35.     public String execute() throws Exception {  
  36.         String realPath = ServletActionContext.getServletContext().getRealPath("/images");  
  37.         System.out.println(realPath);  
  38.         if(uploadFile !=null ){  
  39.             File destFile = new File(new File(realPath), uploadFileFileName);//根據 parent 抽象路徑名和 child 路徑名字符串建立一個新 File 實例。  
  40.             if(!destFile.getParentFile().exists())//判斷路徑"/images"是否存在  
  41.                 destFile.getParentFile().mkdirs();//若是不存在,則建立此路徑  
  42.             //將文件保存到硬盤上,由於action運行結束後,臨時文件就會自動被刪除  
  43.             FileUtils.copyFile(uploadFile, destFile);  
  44.             ActionContext.getContext().put("message""文件上傳成功!");  
  45.         }  
  46.         return "success";  
  47.     }  

form.jsp頁面的代碼以下所示:
  1. <body>  
  2. <form action="${pageContext.request.contextPath }/demo/test.action" method="post" enctype="multipart/form-data">  
  3.     文件:<input type="file" name="uploadFile"></input>  
  4.     <input type="submit" name="submit" value="上傳"></input>  
  5. </form>  
  6. </body> 

 代碼${pageContext.request.contextPath }等於<%=request.getContextPath() %>。app

result.jsp頁面的代碼以下:eclipse

  1. <body>  
  2. 文件類型:${uploadFileContentType }<br>  
  3. ${uploadFileFileName} ${message}  
  4.  </body> 

本人 進行測試,發現此時只要上傳的文件不要超過2M,均可以順利上傳成功。上傳完成後會返回文件的文件名等信息。以下所示:socket

文件類型:application/octet-streamjsp

desktop.ini 文件上傳成功!post

在應用程序部署的文件夾下會產生一個images文件夾,在此文件夾下會有一個desktop.ini文件。

同進在控制檯打印了以下的信息,說明上傳時產生的臨時文件刪除成功:

2010-11-12 14:52:59 com.opensymphony.xwork2.util.logging.jdk.JdkLogger info
信息: Removing file uploadFile D:\workspace\eclipsespace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\struts_helloworld\upload__43a41dcc_12c3ec6e75a__8000_00000002.tmp

 

但要是我上傳一個大於2M的文件,就會上傳失敗,控制檯打印的信息以下所示:

警告: Unable to parse request
org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (3018061) exceeds the configured maximum (2097152)

。。。

警告: the request was rejected because its size (3018061) exceeds the configured maximum (2097152)

這是由於struts2一次上傳文件時默認的總大小是2097152B,因此在默認狀況下上傳的文件不能大於2M。

此時在struts.xml文件中,增長代碼<constant name="struts.multipart.maxSize" value="10701096"/> ,

將它的文件上傳限制設爲10M左右,上面的文件就能正常上傳了。配置文件以下所示:

  1. <struts>  
  2. <constant name="struts.multipart.maxSize" value="10701096"/>   
  3.     <package name="myDemo" namespace="/demo" extends="struts-default">      
  4.         <action name="test" class="demo.action.TestAction">  
  5.         <result>/WEB-INF/jsp/result.jsp</result>  
  6.         </action>  
  7.     </package>  
  8. </struts> 

 注意:struts2中的文件限制參數<constant name="struts.multipart.maxSize" value="10701096"/>並非能夠無限制的改大的,通常不能太大,以不超過10M的文件。這是由於web的性質決定的。基於web上傳的文件都不能太大,若是要上傳更大的文件,能夠考慮使用瀏覽器插件(實際上是一種通信軟件),相似於迅雷這樣子的軟件。這些軟件都是基於socket來上傳文件的。

 

2、struts2上傳多文件

<1> 在form表單中的有多個file類型的input節點

  1. <body>  
  2. <form action="${pageContext.request.contextPath }/demo/test.action" method="post" enctype="multipart/form-data">  
  3.     文件1:<input type="file" name="uploadFiles"></input>  
  4.     文件2:<input type="file" name="uploadFiles"></input>  
  5.     文件3:<input type="file" name="uploadFiles"></input>  
  6.     <input type="submit" name="submit" value="上傳"></input>  
  7. </form>  
  8. </body> 
 <2>action類以下所示:
  1. public class TestAction {  
  2.   
  3.     // 能夠定義成數組類型,也能夠定義成list  
  4.     private File[] uploadFiles; // 獲得上傳的文件,此屬性對應於表單中文件字段的名稱  
  5.     // 下面的這兩個屬性的命名必須遵照上定的規則,即爲"表單中文件字段的名稱" + "相應的後綴"  
  6.     private String[] uploadFilesContentType; // 獲得上傳的文件的數據類型,  
  7.     private String[] uploadFilesFileName; // 獲得上傳的文件的名稱  
  8.   
  9. //setter和getter方法     
  10. public String execute() throws Exception {  
  11.         String realPath = ServletActionContext.getServletContext().getRealPath(  
  12.                 "/images");  
  13.         File file = new File(realPath);  
  14.         if (!file.exists())  
  15.             file.mkdirs();  
  16.         if (uploadFiles != null) {  
  17.             for (int i = 0; i < uploadFiles.length; i++) {  
  18.                 File uploadFile = uploadFiles[i];  
  19.                 FileUtils.copyFile(uploadFile, new File(file,  
  20.                         uploadFilesFileName[i]));  
  21.             }  
  22.             ActionContext.getContext().put("message""文件上傳成功!");  
  23.         }  
  24.         return "success";  
  25.     }  


原文連接:http://www.faceye.net/search/143092.html

相關文章
相關標籤/搜索