Struts2學習筆記(十一)——文件上傳


1、單文件上傳

單文件上傳步驟:

 1)創建上傳jsp頁面

文件上傳的表單提交方式必須是POST方式,編碼類型:enctype="multipart/form-data",默認是 application/x-www-form-urlencoded,比如:

1 <form action="${pageContext.servletContext.contextPath}/uploadAction.action" enctype="multipart/form-data" method="post"> 

 2)創建處理文件上傳Action類

  • 在Action類中聲明相關屬性:
    • 要聲明與頁面中表單name屬性同名的屬性,同名的屬性的類型是File類型,該屬性用來保存臨時文件;
    • 要聲明[同名的屬性]ContentType屬性,類型是String類型,該屬性表示上傳文件的類型;
    • 要聲明[同名的屬性]FileName屬性,類型是String類型,該文件表示要上傳的文件;
    • 給所有屬性提供get和set方法。
  • 在Action類中提供處理上傳的方法:
    • 獲取要保存文件的位置;
    • 在目標文件夾內,創建一個與上傳文件同名的文件;
    • 通過FileUtils工具類提供copyFile()方法,將臨時文件內容拷貝到目標文件夾下的那個同名的文件;
    • 調用保存臨時文件的屬性的delete()方法刪除臨時文件(也就是File類型屬性的delete方法)。

 3)配置struts.xml文件

  • 設置上傳文件大小,Struts2默認上傳文件總大小為2MB,超過文件總大小,跳轉input視圖,通過<s:actionError /> 回顯錯誤信息,在struts.xml 設置上傳總大小:
    1 <constant name="struts.multipart.maxSize" value="20000000"></constant>

    設置上傳文件總大小,對所有上傳form有效,只想對當前form進行設置,可以設置fileUpload攔截器屬性

  • 在fileUpload攔截器中有三個屬性:
    • protected Long maximumSize:可以設置每一個上傳文件的大小
    • protected Set<String> allowedTypesSet:設置允許上傳文件的類型
    • protected Set<String> allowedExtensionsSet:設置允許的上傳文件的后綴名

可以在struts.xml文件中配置這些屬性:

1 <interceptor-ref name="defaultStack">
2     <!--配置上傳文件的大小,這里配置的是上傳文件的單個大小-->
3     <param name="fileUpload.maximumSize">20971520</param>   
4     <!-- 配置上傳文件允許的類型-->
5     <param name="fileUpload.allowedTypes">text/plain,application/msword</param>
6     <!-- 配置上傳文件的擴展名-->
7     <param name="fileUpload.allowedExtensions">.txt,.doc</param>
8 </interceptor-ref>

允許的類型(allowedTypes)和允許的擴展名(allowedExtensions)必須保持一致。

單文件上傳示例:

 1)創建jsp頁面 

1 <body>
2  <form action="${pageContext.servletContext.contextPath}/uploadAction.action" enctype="multipart/form-data" method="post">
3     上傳文件:<input type="file" name="upload">
4     <input type="submit" value="上傳">
5  </form>
6 </body>

 2)創建Action類

 1 public class UploadAction extends ActionSupport {
 2     private File upload;
 3     private String uploadContentType;
 4     private String uploadFileName;
 5     
 6     public File getUpload() {
 7         return upload;
 8     }
 9 
10     public void setUpload(File upload) {
11         this.upload = upload;
12     }
13 
14     public String getUploadContentType() {
15         return uploadContentType;
16     }
17 
18     public void setUploadContentType(String uploadContentType) {
19         this.uploadContentType = uploadContentType;
20     }
21 
22     public String getUploadFileName() {
23         return uploadFileName;
24     }
25 
26     public void setUploadFileName(String uploadFileName) {
27         this.uploadFileName = uploadFileName;
28     }
29 
30     @Override
31     public String execute() throws Exception {
32         ServletContext sc = ServletActionContext.getServletContext();
33         //獲取要保存文件的位置
34         String path = sc.getRealPath("/upload");
35         //創建一個與上傳文件同名的文件
36         File file = new File(path, uploadFileName);
37         //將臨時文件內容拷貝到目標文件夾下的那個同名的文件
38         FileUtils.copyFile(upload, file);
39         //刪除臨時文件
40         upload.delete();
41         return SUCCESS;
42     }
43 }

 3)配置struts.xml文件

 1 <struts>
 2     <constant name="struts.devMode" value="true" />
 3     <constant name="struts.multipart.maxSize" value="200000000"/> 
 4     <package name="default" namespace="/" extends="struts-default">
 5         <action name="uploadAction" class="com.sunny.action.UploadAction">
 6             <result>/success.jsp</result>
 7             <result name="input">/error.jsp</result>
 8             <interceptor-ref name="defaultStack">
 9                 <param name="fileUpload.maximumSize">20971520</param>
10                 <param name="fileUpload.allowedTypes">text/plain,application/msword</param>
11                 <param name="fileUpload.allowedExtensions">.txt,.doc</param>
12             </interceptor-ref>
13         </action>
14     </package>
15 </struts>

 4)上傳文件界面

 5)上傳成功后會跳轉到success.jsp頁面

 6)項目下的upload文件夾下會有上傳的文件

上傳問題信息國際化

Struts2上傳問題信息默認的文件為在struts-message.properties下:

1 struts.messages.error.uploading=Error uploading: {0}
2 struts.messages.error.file.too.large=File too large: {0} "{1}" "{2}" {3}
3 struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" "{2}" {3}
4 struts.messages.error.file.extension.not.allowed=File extension not allowed: {0} "{1}" "{2}" {3}

要想實現中文顯示,需要在Action類相同文件下創建ActionClassName.properties文件,其中ActionClassName為上傳Action類的類名,文件內容修改為:

1 struts.messages.error.uploading=上傳錯誤: {0}
2 struts.messages.error.file.too.large=上傳文件太大: {0} "{1}" "{2}" {3}
3 struts.messages.error.content.type.not.allowed=上傳文件的類型不允許: {0} "{1}" "{2}" {3}
4 struts.messages.error.file.extension.not.allowed=上傳文件的后綴名不允許: {0} "{1}" "{2}" {3}

等號前面的內容固定,后面的內容可以自己寫。

2、多文件上傳

多文件上傳的所有流程與單文件上傳一致,但是需要注意的是:

  • 在頁面中,雖然是多文件上傳,但是頁面中表單的name屬性的值必須保持一致;
  • 在Action類中聲明的相關屬性,類型改成數組或者集合;
  • 在業務方法中,相關處理流程改成單文件上傳的循環。

單文件上傳示例:

 1)創建jsp頁面 

1 <body>
2  <form action="${pageContext.servletContext.contextPath}/uploadAction.action" enctype="multipart/form-data" method="post">
3     上傳文件:<input type="file" name="upload"><br>
4     上傳文件:<input type="file" name="upload"><br>
5     上傳文件:<input type="file" name="upload"><br>
6     上傳文件:<input type="file" name="upload"><br>
7     <input type="submit" value="上傳">
8  </form>
9 </body>

 2)創建Action類

 1 public class UploadAction extends ActionSupport {
 2     private File[] upload;
 3     private String[] uploadContentType;
 4     private String[] uploadFileName;
 5     
 6     public File[] getUpload() {
 7         return upload;
 8     }
 9 
10     public void setUpload(File[] upload) {
11         this.upload = upload;
12     }
13 
14     public String[] getUploadContentType() {
15         return uploadContentType;
16     }
17 
18     public void setUploadContentType(String[] uploadContentType) {
19         this.uploadContentType = uploadContentType;
20     }
21 
22     public String[] getUploadFileName() {
23         return uploadFileName;
24     }
25 
26     public void setUploadFileName(String[] uploadFileName) {
27         this.uploadFileName = uploadFileName;
28     }
29 
30     @Override
31     public String execute() throws Exception {
32         ServletContext sc = ServletActionContext.getServletContext();
33         //獲取要保存文件的位置
34         String path = sc.getRealPath("/upload");
35         //創建一個與上傳文件同名的文件
36         for (int i = 0; i < upload.length; i++) {
37             File file = new File(path, uploadFileName[i]);
38             //將臨時文件內容拷貝到目標文件夾下的那個同名的文件
39             FileUtils.copyFile(upload[i], file);
40             //刪除臨時文件
41             upload[i].delete();
42         }
43         return SUCCESS;
44     }
45 }

 3)配置struts.xml文件,和單文件上傳的配置一樣

 1 <struts>
 2     <constant name="struts.devMode" value="true" />
 3     <constant name="struts.multipart.maxSize" value="200000000"/> 
 4     <package name="default" namespace="/" extends="struts-default">
 5         <action name="uploadAction" class="com.sunny.action.UploadAction">
 6             <result>/success.jsp</result>
 7             <result name="input">/error.jsp</result>
 8             <interceptor-ref name="defaultStack">
 9                 <param name="fileUpload.maximumSize">20971520</param>
10                 <param name="fileUpload.allowedTypes">text/plain,application/msword</param>
11                 <param name="fileUpload.allowedExtensions">.txt,.doc</param>
12             </interceptor-ref>
13         </action>
14     </package>
15 </struts>

 4)上傳文件界面

 5)上傳成功后會跳轉到success.jsp頁面

 6)項目下的upload文件夾下會有上傳的文件

 3、文件下載

 

 

 






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM