最愛Java

          書山有路勤為徑,學海無涯苦作舟

          Struts2學習筆記 —— 上傳和下載

              Struts2默認使用Jakarta的Common-FileUpload的文件上傳解析器。見struts.properties配置文件中:

          #指定使用COS的文件上傳解析器
          #struts.multipart.parser
          =cos
          #指定使用Pell的文件上傳解析器
          #struts.multipart.parser
          =pell
          #指定使用Common-FileUpload的文件上傳解析器
          struts.multipart.parser
          =jakarta


             實際上,Struts2的文件上傳功能只是在原有的文件上傳項目上做了進一步的封裝,取消了不同文件上傳項目的編程差異而已。

          import java.io.File;
          import java.io.FileInputStream;
          import java.io.FileOutputStream;

          import com.opensymphony.xwork2.ActionSupport;

          public class UploadAction extends ActionSupport {

              
          private static final long serialVersionUID = -3921956808689128362L;
              
          //封裝文件標題請求參數的屬性
              private String title;
              
          //封裝上傳文件域的屬性
              private File upload;
              
          //封裝上傳文件類型的屬性
              private String uploadContentType;
              
          //封裝上傳文件名的屬性
              private String uploadFileName;
              
          //直接在struts.xml文件中配置的屬性
              private String savePath;
              
              
          //文件標題的setter和getter方法
              public String getTitle() {
                  
          return title;
              }

              
          public void setTitle(String title) {
                  
          this.title = title;
              }

              
          //上傳文件對應文件內容的setter和getter方法
              public File getUpload() {
                  
          return upload;
              }

              
          public void setUpload(File upload) {
                  
          this.upload = upload;
              }

              
          //上傳文件的文件類型的setter和getter方法
              public String getUploadContentType() {
                  
          return uploadContentType;
              }

              
          public void setUploadContentType(String uploadContentType) {
                  
          this.uploadContentType = uploadContentType;
              }

              
          //上傳文件的文件名的setter和getter方法
              public String getUploadFileName() {
                  
          return uploadFileName;
              }

              
          public void setUploadFileName(String uploadFileName) {
                  
          this.uploadFileName = uploadFileName;
              }

              
          //接收struts.xml文件配置值的方法
              public String getSavePath() {
                  
          return savePath;
              }

              
          //返回上傳文件保存位置
              public void setSavePath(String savePath) {
                  
          this.savePath = savePath;
              }

              
              @Override
              
          public String execute() throws Exception {
                  
          //以服務器的文件保存地址和原有文件名建立上傳文件輸出流
                  FileOutputStream fos = new FileOutputStream(getSavePath() + "\\" + getUploadFileName());
                  FileInputStream fis 
          = new FileInputStream(getUpload());
                  
          byte[] buffer = new byte[1024];
                  
          int len = 0;
                  
          while ((len = fis.read(buffer)) > 0{
                      fos.write(buffer, 
          0, len);
                  }

                  
          return SUCCESS;
              }

              
          }


              上面的Action和普通的Action沒有任何區別。只是多了幾個屬性而已。如果表單中包含一個name屬性為xxx的文件域,則對應的Action需要使用3個屬性來封裝該文件域的信息:類型為File的xxx屬性封裝了該文件的內容;類型為String的xxxFileName屬性封裝了該文件域對應的文件的文件名;類型為String的xxxContentType屬性封裝了該文件域對應的文件類型。除此之外,配置了savePath來依賴注入文件上傳后的保存地址。具體的Action配置如下:

          <?xml version="1.0" encoding="GBK"?>
          <!DOCTYPE struts PUBLIC
              "-//Apache Software Foundation/ /DTD Struts Configuration 2.1/ /EN"
              "http://struts.apache.org/dtds/struts-2.1.dtd"
          >
          <struts>
              
          <package name="strutsqs" extends="struts-default">
                  
          <action name="upload" class="com.struts.test.action.UploadAction">
              
          <param name="savePath">/upload</param>        <result>/succ.jsp</result>
                  
          </action>
              
          </package>
          </struts>


              一般我們上傳文件都不是無限制地上傳的,需要制定一些例如文件類型,文件大小等限制。我們可以通過配置Struts2中的攔截器進行文件過濾。Struts2中文件上傳的攔截器是fileUpload。配置fileUpload攔截器,可以為其指定兩個參數:

              allowedTypes:該參數指定允許上傳文件的類型,多了文件類型之間以英文逗號隔開。

              maximuxSize:該參數指定允許上傳文件大小,單位是字節。

              通過配置fileUpload攔截器,可以輕松地實現文件過濾,當文件過濾失敗后,系統自動轉入input視圖。當然,我們必須顯式地為該Action配置defaultStack的攔截器引用。

          <?xml version="1.0" encoding="GBK"?>
          <!DOCTYPE struts PUBLIC
              "-//Apache Software Foundation/ /DTD Struts Configuration 2.1/ /EN"
              "http://struts.apache.org/dtds/struts-2.1.dtd"
          >
          <struts>
              
          <package name="strutsqs" extends="struts-default">
                  
          <action name="upload" class="com.struts.test.action.UploadAction">
                      
          <interceptor-ref name="fileUpload">
                                      
          <param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param>
                                      
          <param name="maximumSize">2000</param>
                                  
          </interceptor-ref>
                                  
          <interceptor-ref name="defaultStack"/>
                                  
          <param name="savePath">/upload</param>
                      
          <result name="input">/upload.jsp</result>
                      
          <result>/succ.jsp</result>
                  
          </action>
              
          </package>
          </struts>


              如果需要使用Pell上傳, 需要使用插件struts2-pell-multipart-plutin-2.1.6.jar文件。此壓縮包中有一個PellMultiPartRequest類。同時在struts-plugin.xml中有如下Bean配置:

                   <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="pell" class="org.apache.struts2.dispatcher.multipart.PellMultiPartRequest" />
             指明了解析接口的實現類。有了這個聲明,我們只需在struts.xml中顯式地聲明一下sturts.multipart.parser的值為pell即可:

                   <constant name="struts.multipart.parser" value="pell"/>

                   說道此處,上傳基本說完了。如果需要同時上傳多了文件,只要將Action中涉及文件上傳的屬性聲明為數組或List即可。

                   Struts2的文件下載也和普通Action沒有區別,只是返回的是InputStream流而已。

          import java.io.InputStream;

          import com.opensymphony.xwork2.ActionSupport;
          import org.apache.struts2.ServletActionContext;

          public class FileDownloadAction extends ActionSupport {

              
          private static final long serialVersionUID = 7160810536224371999L;
              
          //該屬性是依賴注入的屬性,可以在配置文件中動態指定該屬性值
              private String inputPath;

              
          public String getInputPath() {
                  
          return inputPath;
              }


              
          public void setInputPath(String inputPath) {
                  
          this.inputPath = inputPath;
              }

              
              
              
          public InputStream getTargetFile() throws Exception {
                   
          return ServletActionContext.getServletContext().getResourceAsStream(inputStream);
              }

          }


              代碼很簡單,關鍵是需要配置stream類型的結果。配置stream類型的結果需要指定如下4個屬性:

          • contentType:指定被下載文件的文件類型
          • inputName:指定被下載文件的入口流入流
          • contentDisposition:指定下載的文件名
          • bufferSize:指定下載文件時的緩沖大小

               

          <action name="download" class="com.struts.test.action.DownloadAction">
              
          <param name="inputPath">\images\t.jpg</param>
              
          <result name="success" type="stream">
                  
          <param name="contentType">image/jpg</param>
                  
          <!-- 指定getTargetFile()方法返回被下載文件的InputStream-->
                  
          <param name="inputName">targetFile</param>
                  
          <param name="contentDisposition">filename="wjc_lgo.jpg"</param>
                  
          <param name="bufferSize">4096</param>
              
          </result>
          </action>

          posted on 2010-11-07 14:19 Brian 閱讀(477) 評論(0)  編輯  收藏 所屬分類: Struts2

          公告


          導航

          <2010年11月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          統計

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 石台县| 乌拉特前旗| 历史| 二手房| 沈丘县| 铜山县| 偃师市| 临泽县| 镇江市| 青田县| 桂林市| 永丰县| 绩溪县| 宝坻区| 固原市| 桂东县| 晋江市| 塘沽区| 衡东县| 湖北省| 通州区| 临泉县| 合水县| 信阳市| 武山县| 博爱县| 定西市| 抚顺县| 宁明县| 平湖市| 揭东县| 阿勒泰市| 承德市| 寿宁县| 常山县| 射阳县| 通辽市| 四平市| 维西| 夏河县| 广东省|