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、文件下載