struts檔案上傳詳解

南夏發表於2015-12-13
 

Struts2上傳單檔案或者多個檔案的好處

問題?Struts2上傳單檔案或者多個檔案的好處在哪裡呢?我們都知道上傳檔案的基本步驟都是讀取檔案域,得到檔名,然後得到真實儲存路徑,然後再構建輸入輸出流,這樣幾個步驟,我們的檔案上傳也就搭成了。顯得有些麻煩了是吧?接下來讓我們去看看,struts2給我們帶來的便利。

原理:struts2擁有自動轉換型別的功能,這是好處一。struts2我們所拷入的common-io.jar包整合了一個工具類,運用這個工具類可以幫我們達到上傳檔案的目的。

*首先搭建好struts2的環境(7個jar包,攔截器之類的配置),詳情可看:http://blog.csdn.net/mr_li13/article/details/49391329?

案例:運用struts2肯定要用它的配置檔案struts.xml啦、

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE struts PUBLIC  
  3.             "-//Apache Software Foundation//DTD Struts Configuration <span style="color:#ff0000;">2.0</span>//EN"  
  4.             "http://struts.apache.org/dtds/struts-<span style="color:#ff0000;">2.0</span>.dtd">  
  5.               
  6. <struts>  
  7. <!-- constant表示常量設定,設定配置檔案自動更新,開發中很重要 -->  
  8. <constant name="struts.action.extension" value="action,,do"></constant>  
  9. <constant name="struts.devMode" value="true"></constant>  
  10.   
  11. <!-- 各個配置檔案的包含 -->  
  12.   
  13. <!-- 單個檔案下載action -->  
  14. <include file="UpLoadFile.xml"></include>  
  15.   
  16. <!-- 多個檔案上傳action -->  
  17. <include file="moreUpLoadFile.xml"></include>  
  18.   
  19.   
  20. </struts>  
  21.               

紅色標記處。一定要相同。不然就會出不聯網就會報錯。詳情請看

1.單個檔案:

UpLoadFile.xml檔案內容

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE struts PUBLIC  
  3.             "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.             "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5.               
  6. <struts>  
  7. <!-- constant表示常量設定,設定配置檔案自動更新,開發中很重要 -->  
  8. <constant name="struts.action.extension" value="action,,do"></constant>  
  9. <constant name="struts.devMode" value="true"></constant>  
  10. <!-- 設定檔案上傳大小 50M-->  
  11. <constant name="struts.multipart.maxSize" value="52428800"></constant>  
  12.    
  13.  <!-- 檔案下載action -->  
  14. <package name="upload" namespace="/upload" extends="struts-default">  
  15.     <action name="upload1" class="com.itcast.web.domain.uploadAction" method="execute">  
  16.         <result name="success">/uploadSuccess.jsp</result>  
  17.     </action>  
  18. </package>  
  19.   
  20. </struts>  

上傳頁面:upload.jsp

  1. <!-- 於http://localhost:8080/Struts2day1/upload.jsp -->  
  2.     <form action="${pageContext.request.contextPath}/upload/upload1.action" method="post" enctype="multipart/form-data">  
  3.         檔案:<input type="file" name="img"/><br/><!-- name這個名字必須和action類中的setter名字相同,首先執行setter方法,struts2會自動封裝 -->  
  4.             <input type="submit" value="上傳"/>  
  5.     </form>  

action實體類:uploadAction.class

  1. package com.itcast.web.domain;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileNotFoundException;  
  6. import java.io.FileOutputStream;  
  7. import java.io.InputStream;  
  8. import java.io.OutputStream;  
  9. import java.io.Serializable;  
  10.   
  11. import javax.servlet.ServletContext;  
  12.   
  13. import org.apache.commons.io.FileUtils;  
  14. import org.apache.struts2.ServletActionContext;  
  15.   
  16. import com.opensymphony.xwork2.ActionContext;  
  17. import com.opensymphony.xwork2.ActionSupport;  
  18.   
  19. public class uploadAction extends ActionSupport implements Serializable {  
  20.     private File img;//代表表單中檔案上傳輸入域的名稱,struts會自動封裝成file域在此進行處理  
  21.     private String imgFileName;  
  22.     //得到上傳域中,檔案的名字,是不是很方便啊,struts已經為我們做好了  
  23.     //只需要與File的物件名稱多FileName就可以了,而且檔名的編碼格式已經轉化好了  
  24.     private String imgContentType;//同理封裝好了一個檔案型別類  
  25.       
  26.       
  27.     /** 
  28.      * @return 
  29.      *  <interceptor name="fileUpload"  
  30.      *  class="org.apache.struts2.interceptor.FileUploadInterceptor"/> 
  31.      *   
  32.      *  整個的檔案封裝全部都是靠struts2-core這個包中的struts-default.xml這個檔案中的衣裳攔截器實現的 
  33.      */  
  34.     public File getImg() {  
  35.         return img;  
  36.     }  
  37.   
  38.     public void setImg(File img) {  
  39.         this.img = img;  
  40.     }  
  41.   
  42.       
  43.       
  44.     public String getImgFileName() {  
  45.         return imgFileName;  
  46.     }  
  47.   
  48.     public void setImgFileName(String imgFileName) {  
  49.         this.imgFileName = imgFileName;  
  50.     }  
  51.   
  52.     public String getImgContentType() {  
  53.         return imgContentType;  
  54.     }  
  55.   
  56.     public void setImgContentType(String imgContentType) {  
  57.         this.imgContentType = imgContentType;  
  58.     }  
  59.       
  60.     /* (non-Javadoc) 
  61.      * @see com.opensymphony.xwork2.ActionSupport#execute() 
  62.      * 處理檔案上傳業務 
  63.      */  
  64.       
  65.     public String execute(){  
  66. //      我們自然用最新的方式。簡便許多  
  67.         try {  
  68.               
  69.                     System.out.println(imgContentType);//image/jpeg  
  70.               
  71.             //找到檔案存放路徑  
  72.             ServletContext sc=ServletActionContext.getServletContext();  
  73.             String storpath=sc.getRealPath("files");  
  74.             //老方式  
  75.             //構建輸出流  
  76. //          OutputStream out=new FileOutputStream(storpath+"\\"+imgFileName);  
  77. //          InputStream in=new FileInputStream(img);  
  78. //            
  79. //          byte b[]=new byte[1024];  
  80. //          int len=-1;  
  81. //          while((len=in.read(b))!=-1){  
  82. //              out.write(b, 0, len);  
  83. //          }  
  84. //          out.close();  
  85. //          in.close();  
  86.               
  87.             //新方式,用拷入的jar包commons-io這個jar包,  
  88.             //裡面有封裝的一個類,使我們上傳檔案更容易(前者是檔案源,後者是路徑(主路徑,子路徑))  
  89.             FileUtils.copyFile(img, new File(storpath, imgFileName));  
  90.               
  91.             ActionContext.getContext().put("message""上傳成功!");  
  92.             return SUCCESS;  
  93.               
  94.         } catch (Exception e) {  
  95.             e.printStackTrace();  
  96.             return ERROR;  
  97.         }  
  98.     }  
  99. }  

成功頁面:uploadSuccess.jsp

  1. <body>  
  2.     ${message }  
  3.   </body>  

2.多檔案上傳

其實方式都差不多隻是將實體類中的屬性變成了陣列形式

moreUploadFile.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE struts PUBLIC  
  3.             "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.             "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5.               
  6. <struts>  
  7. <!-- constant表示常量設定,設定配置檔案自動更新,開發中很重要 -->  
  8. <constant name="struts.action.extension" value="action,,do"></constant>  
  9. <constant name="struts.devMode" value="true"></constant>  
  10. <!-- 設定檔案上傳大小 50M-->  
  11. <constant name="struts.multipart.maxSize" value="52428800"></constant>  
  12. <package name="moreupload" namespace="/moreupload" extends="struts-default">  
  13.     <action name="upload1" class="com.itcast.web.domain.moreUploadAction" method="execute">  
  14.         <result name="success">/uploadSuccess.jsp</result>  
  15.     </action>  
  16. </package>  
  17. </struts>  

moreupload.jsp

  1. <!-- http://localhost:8080/Struts2day1/upload.jsp -->  
  2.     <form action="${pageContext.request.contextPath}/moreupload/upload1.action" method="post" enctype="multipart/form-data">  
  3.         檔案1:<input type="file" name="img"/><br/><!-- name這個名字必須和action類中的setter名字相同,首先執行setter方法,struts2會自動封裝 -->  
  4.         檔案2:<input type="file" name="img"/><br/>  
  5.             <input type="submit" value="上傳"/>  
  6.     </form>  

實體類:moreUploadAction.class

  1. package com.itcast.web.domain;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileNotFoundException;  
  6. import java.io.FileOutputStream;  
  7. import java.io.InputStream;  
  8. import java.io.OutputStream;  
  9. import java.io.Serializable;  
  10.   
  11. import javax.servlet.ServletContext;  
  12.   
  13. import org.apache.commons.io.FileUtils;  
  14. import org.apache.struts2.ServletActionContext;  
  15.   
  16. import com.opensymphony.xwork2.ActionContext;  
  17. import com.opensymphony.xwork2.ActionSupport;  
  18.   
  19. /** 
  20.  * @author Administrator 
  21.  *多檔案上傳案例 
  22.  */  
  23. public class moreUploadAction extends ActionSupport implements Serializable {  
  24.     private File[] img;//代表表單中檔案上傳輸入域的名稱,struts會自動封裝成file域在此進行處理  
  25.     private String[] imgFileName;  
  26.     //得到上傳域中,檔案的名字,是不是很方便啊,struts已經為我們做好了  
  27.     //只需要與File的物件名稱多FileName就可以了,而且檔名的編碼格式已經轉化好了  
  28.     private String[] imgContentType;//同理封裝好了一個檔案型別類  
  29.       
  30.       
  31.       
  32.       
  33.     public File[] getImg() {  
  34.         return img;  
  35.     }  
  36.   
  37.     public void setImg(File[] img) {  
  38.         this.img = img;  
  39.     }  
  40.   
  41.     public String[] getImgFileName() {  
  42.         return imgFileName;  
  43.     }  
  44.   
  45.     public void setImgFileName(String[] imgFileName) {  
  46.         this.imgFileName = imgFileName;  
  47.     }  
  48.   
  49.     public String[] getImgContentType() {  
  50.         return imgContentType;  
  51.     }  
  52.   
  53.     public void setImgContentType(String[] imgContentType) {  
  54.         this.imgContentType = imgContentType;  
  55.     }  
  56.   
  57.     public String  execute(){  
  58.         try {  
  59.             if(img!=null&&img.length>0){  
  60.             ServletContext sc=ServletActionContext.getServletContext();  
  61.             String storpath=sc.getRealPath("files");  
  62.               
  63.             for(int i=0;i<img.length;i++){  
  64.                     FileUtils.copyFile(img[i], new File(storpath, imgFileName[i]));  
  65.                 }  
  66.             }  
  67.               
  68.             ActionContext.getContext().put("message""上傳成功!");  
  69.             return SUCCESS;  
  70.       
  71.         } catch (Exception e) {  
  72.             e.printStackTrace();  
  73.             return ERROR;  
  74.             }  
  75.     }  
  76. }  

成功頁面和uploadSuccess.jso內容一樣的,共用。


相關文章