基於 Struts2 的單文件和多文件上傳

文件的上傳下載是 Web 開發中老生常談的功能,基於 Struts2 框架對於實現這一功能,更是可以給咱們帶來不少的便利。Struts2 已經有默認的 upload 攔截器。咱們只須要寫參數,它就會自動幫咱們封裝好。這篇咱們就先來看一下基於 Struts2 的單文件和多文件上傳。java

1、 單文件上傳

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 }
相關文章
相關標籤/搜索