【Struts2】【文件的上傳和下載】【fileUpload攔截器】

文件上傳

1.jsp的設置

  • enctype=”multipart/form-data” 上傳必備
  • method=”post”
  • 使用<s: file name="XX"/>
<s:form action="/Upload" method="post" enctype="multipart/form-data" theme="simple">
    選擇圖片:<s:file name="myPicture" /><br/>
<s:submit value="do it"/>
</s:form>

2.Action的設置

1.接收三個參數

    private File myPicture;//文件對象
    private String myPictureFileName;//用戶傳入文件名   如XXX.png
    private String myPictureContentType;//文件的MIME類型  如image/png

    //三個參數的setter方法
    public void setMyPicture(File myPicture) {
        this.myPicture = myPicture;
    }
    public void setMyPictureFileName(String myPictureFileName) {
        this.myPictureFileName = myPictureFileName;
    }
    public void setMyPictureContentType(String myPictureContentType) {
        this.myPictureContentType = myPictureContentType;
    }

2.處理上傳文件
- 獲得webapp下的路徑ServletActionContext.getServletContext().getRealPath(“/WEB_INF/upload”);
- 獲得新的文件對象 new File(路徑,文件名)
- 文件拷貝

public class UploadAction extends ActionSupport implements Validateable{


    public void validateExecute() {
        if(myPicture==null) {
            super.addFieldError("file","請選擇上傳文件");
        }
    }
    @InputConfig(resultName="login")
    public String execute() throws Exception {
        //獲取文件存儲的路徑
        ServletContext app = ServletActionContext.getServletContext();
        String path = app.getRealPath("/WEB-INF/upload");
        System.out.println(path);
        //保存上傳文件
        File file = new  File(path,myPictureFileName);
        FileUtils.copyFile(myPicture, file);
        return "login";
    }
}   

3.配置文件的設置

常量配置

struts.multipart.parser=jakarta    //上傳文件的組件
struts.multipart.saveDir=XX        //臨池文件的目標 (不改)
struts.multipart.maxSize=2097152   //一次請求所有文件的大小不超2M

fileUpload攔截器

  • 設置單個文件的大小
  • 設置上傳文件的類型
  • 因爲上傳的Action類很少,所以攔截器直接聲明在<action>
<action name="Upload_*" class="action.UploadAction" method="{1}">
            <!--聲明上傳攔截器-->
             <interceptor-ref name="fileUpload">
                    <param name="allowedExtensions">png,gif</param>
                    <param name="maximumSize">102400</param>
             </interceptor-ref>
            <!--聲明上傳默認攔截器-->
             <interceptor-ref name="defaultStack"/>
</action>

情況1;上傳文件不符合大小時:
這裏寫圖片描述
情況2:上傳文件不符合類型時;
這裏寫圖片描述

4.錯誤信息的國際化

如何使得文件過大,文件不符合類型轉爲中文信息?

  1. 英文信息來源
    這裏寫圖片描述

  2. 數值的含義

    • {0}:文件對象的名,即<s:file>的name屬性
    • {1}:用戶上傳的文件本地名稱
    • {2}:在臨時目錄中的名稱
    • {3}:文件的mime類型
    • {4}:攔截器中,文件的最大值
    • -
  3. 修改成中文

添加uploadMessage.properties文件

struts.messages.error.file.too.large=文件{1}過大,請不要超過{4}
struts.messages.error.file.extension.not.allowed=文件類型爲{3},不符合要求

引入到struts.xml文件中

    <constant name="struts.custom.i18n.resources" value="uploadMessage"/>

修改後的結果爲
這裏寫圖片描述
這裏寫圖片描述

文件下載

jsp的設置

fileName的作用:
- 在Action類中,配合路徑定位到文件
- 在Struts.xml文件中,設爲用戶下載文件的默認名

<s:a action="/Download?fileName=文件名">文件名</s:a>
<s:a action="/Download?fileName=LWF.png">LWF.png</s:a>

Action類的設置

  • 接收請求的參數fileName
    • setter:用於請求時候注入參數
    • getter:用於給用戶下載文件時候,提供默認文件名
    private String fileName;
    //用於接收請求來的參數
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
    //用於struts.xml中輸出參數
    public String getFileName() {
        return fileName;
    }
public class DownloadAction extends ActionSupport{

    //用於返回文件的方法 ,getXXX
    public InputStream getInputStream() throws Exception {
        //獲得文件所在目錄
        ServletContext app = ServletActionContext.getServletContext();
        String path = app.getRealPath("/WEB-INF/download");
        //生成文件對象
        File file=new File(path,fileName);
        return new FileInputStream(file);
    }
}
//增強:可以用包裝的讀取流來提速
return new BufferedInputStream(new FileInputStream(file));

struts.xml的設置

  • 下載的邏輯視圖類型爲”stream”
  • 設置參數
    • inputName=輸出流的方法名稱
    • contentDisposition=attachment;filename=”用戶下載文件時候的默認名”
      //用${fileName}從Root中取(因爲有getter方法)
            <action name="Download_*" class="action.DownloadAction" method="{1}">
                <result type="stream">
                    <param name="inputName">inputStream</param><!--是默認值,也對應這方法getInputStream-->
                    <param name="contentDisposition">attachment;filename="hahah"</param>
                </result>   
            </action>

執行流程

1.訪問Action後,返回邏輯視圖爲success,type爲"stream";(默認訪問execute方法返回success)
2.根據參數inputName,從Action中獲得文件的輸出流,
3.根據contentDisposition,給被下載的文件賦予初始名
4.響應給用戶
發佈了73 篇原創文章 · 獲贊 12 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章