文件的上傳下載是 Web 開發中老生常談的功能,基於 Struts2 框架對於實現這一功能,更是可以給咱們帶來不少的便利。Struts2 已經有默認的 upload 攔截器。咱們只須要寫參數,它就會自動幫咱們封裝好。這篇咱們就先來看一下基於 Struts2 的單文件和多文件上傳。java
1.1 導 jar 包web
commons-fileupload-1.3.jarapache
commons-io-2.0.1.jarapp
commons-logging-1.1.3.jar框架
freemarker-2.3.19.jarjsp
ognl-3.0.6.jarpost
struts2-core-2.3.15.3.jarthis
xwork-core-2.3.15.3.jarurl
1.2 web.xml 配置 Struts2 核心過濾器spa
1 <filter> 2 <filter-name>struts2</filter-name> 3 <filter-class> 4 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 5 </filter-class> 6 </filter> 7 8 <filter-mapping> 9 <filter-name>struts2</filter-name> 10 <url-pattern>/*</url-pattern> 11 </filter-mapping>
1.3 JSP 文件上傳頁(注意 file 的 name 屬性必定要與 Action 裏面的 File 類型屬性名一致)
1 <!-- 文件上傳的必要前提: 2 1.請求方式必須是post 3 2.enctype屬性的取值必須是multipart/form-data 4 3.提供一個文件選擇域 文件上傳 5 --> 6 7 <s:form action="upload.action" enctype="multipart/form-data"> 8 9 <s:file name="myfile" label="請選擇文件"></s:file> 10 <s:submit value ="提交"></s:submit> 11 12 </s:form>
1.4 實現文件上傳的 UploadAction
1 package com.fhcq.action; 2 3 import java.io.File; 4 import javax.servlet.ServletContext; 5 import org.apache.commons.io.FileUtils; 6 import org.apache.struts2.ServletActionContext; 7 import com.opensymphony.xwork2.ActionSupport; 8 9 public class UploadAction extends ActionSupport { 10 11 //表單上提供的字段 12 private File myfile; 13 //struts2在文件上傳時提供的屬性 14 private String myfileFileName;//上傳的文件名。上傳字段名稱+FileName 注意大小寫 15 private String myfileContentType;//上傳文件的MIME類型。上傳字段名稱+ContentType 注意大小寫 16 public String upload (){ 17 18 //1.拿到ServletContext 19 ServletContext servletContext = ServletActionContext.getServletContext(); 20 //2.調用realPath方法,獲取根據一個虛擬目錄獲得的真實目錄 21 String realPath = servletContext.getRealPath("/WEB-INF/file"); 22 //3.若是這個真實的目錄不存在,須要建立 23 File file = new File(realPath ); 24 if(!file.exists()){ 25 file.mkdirs(); 26 } 27 //4.把文件存過去 28 //拷貝:把文件的臨時文件複製到指定的位置。注意:臨時文件還在 29 //FileUtils.copyFile(myfile, new File(file,myfileFileName)); 30 31 //剪切:把臨時文件剪切指定的位置,而且給他重命名。 注意:臨時文件沒有了 32 myfile.renameTo(new File(file,myfileFileName)); 33 return SUCCESS; 34 } 35 36 public File getMyfile() { 37 return myfile; 38 } 39 40 public void setMyfile(File myfile) { 41 this.myfile = myfile; 42 } 43 44 public String getMyfileFileName() { 45 return myfileFileName; 46 } 47 48 public void setMyfileFileName(String myfileFileName) { 49 this.myfileFileName = myfileFileName; 50 } 51 52 public String getMyfileContentType() { 53 return myfileContentType; 54 } 55 56 public void setMyfileContentType(String myfileContentType) { 57 this.myfileContentType = myfileContentType; 58 } 59 60 }
1.5 配置 struts.xml(注意:修改文件上傳的總的大小。)
1 <struts> 2 <!--constant修改struts2的默認配置值 --> 3 <!--修改struct2稱爲開發模式,修改配置以後會自動加載 --> 4 <constant name="struts.devMode" value="true" /> 5 <!-- 限制上傳文件的大小,第一種方式:經過修改struts2的常量。 6 在default.properties中配的struts.multipart.maxSize=2097152--> 7 <constant name="struts.multipart.maxSize" value="4097152" /> 8 9 <package name="p1" extends="struts-default"> 10 11 <action name ="upload" class = "com.fhcq.action.UploadAction" method="upload"> 12 13 <!-- 第二種方式:經過給fileUpload的攔截器注入參數的形式,控制上傳文件的大小 14 沒法使用 <param name="fileUpload.maximumSize">31457280</param>--> 15 <interceptor-ref name="defaultStack"> 16 <!-- 限制上傳文件的擴展名。若是有多個,使用逗號分隔 17 <param name="fileUpload.allowedExtensions">jpg,png,bmp</param>--> 18 <!-- 限制上傳文件的MIME類型。 若是有多個,使用逗號分隔 --> 19 <param name="fileUpload.allowedTypes">image/jpg,image/pjpeg,image/png 20 </param> 21 </interceptor-ref> 22 <result>/index.jsp</result> 23 <result name="input" type="redirect">/upload.jsp</result> 24 </action> 25 26 </package> 27 28 </struts>
1.6 配置 fileupload_message.properties,放置在 src 下用來顯示錯誤的資源文件信息
1 struts.messages.error.content.type.not.allowed=\u4E0A\u4F20\u6587\u4EF6\u7684\u7C7B\u578B\u4E0D\u662F\u88AB\u652F\u6301\u7684: {0} "{1}" "{2}" {3}
2、 多文件上傳
在以上單文件上傳的基礎上,修改內容以下:
2.1 JSP 文件上傳頁(注意 file 的 name 屬性必定要與 Action 裏面的 File 類型屬性名一致)
1 <!-- 文件上傳的必要前提: 2 1.請求方式必須是post 3 2.enctype屬性的取值必須是multipart/form-data 4 3.提供一個文件選擇域 5 --> 6 7 <s:form action="upload.action" enctype="multipart/form-data"> 8 9 <s:file name="myfile" label="請選擇文件"></s:file> 10 <s:file name="myfile" label="請選擇文件"></s:file> 11 <s:submit value ="提交"></s:submit> 12 13 </s:form>
2.2 實現文件上傳的 UploadAction
1 package com.fhcq.action; 2 3 import java.io.File; 4 5 import javax.servlet.ServletContext; 6 7 import org.apache.struts2.ServletActionContext; 8 9 import com.opensymphony.xwork2.ActionSupport; 10 11 public class UploadAction extends ActionSupport { 12 13 //表單上提供的字段 14 private File[] myfile; 15 //struts2在文件上傳時提供的屬性 16 private String[] myfileFileName;上傳的文件名。上傳字段名稱+FileName 注意大小寫 17 private String[] myfileContentType;//上傳文件的MIME類型。上傳字段名稱+ContentType 注意大小寫 18 19 public String upload (){ 20 21 //1.拿到ServletContext 22 ServletContext servletContext = ServletActionContext.getServletContext(); 23 //2.調用realPath方法,獲取根據一個虛擬目錄獲得的真實目錄 24 String realPath = servletContext.getRealPath("/WEB-INF/files"); 25 //3.若是這個真實的目錄不存在,須要建立 26 File file = new File(realPath ); 27 if(!file.exists()){ 28 file.mkdirs(); 29 } 30 //4.把文件存過去 31 //剪切:把臨時文件剪切指定的位置,而且給他重命名。 注意:臨時文件沒有了 32 for(int i=0;i<myfile.length;i++){ 33 myfile[i].renameTo(new File(file,myfileFileName[i])); 34 } 35 36 return SUCCESS; 37 } 38 39 public File[] getMyfile() { 40 return myfile; 41 } 42 43 public void setMyfile(File[] myfile) { 44 this.myfile = myfile; 45 } 46 47 public String[] getMyfileFileName() { 48 return myfileFileName; 49 } 50 51 public void setMyfileFileName(String[] myfileFileName) { 52 this.myfileFileName = myfileFileName; 53 } 54 55 public String[] getMyfileContentType() { 56 return myfileContentType; 57 } 58 59 public void setMyfileContentType(String[] myfileContentType) { 60 this.myfileContentType = myfileContentType; 61 } 62 63 }