使用Struts 2控制文件上傳

jopen 8年前發布 | 9K 次閱讀 Struts2 Web框架

           為了能夠上傳文件,我們必須將表單的method 設置為 POST ,將 entype 設置為 multipart/form-data ,只有在這種情況下,瀏覽器才會把用戶選擇文件的二進制數據發送給服務器。

            一旦我們設置了enctypemultipart/form-data,此時瀏覽器將采用二進制流的方式來處理表單數據。但是Struts 2并沒有提供自己的請求解析器,也就是說Struts 2不會自己去處理multipart/form-data的請求,他需要調用其他上傳框架來解析二進制請求數據。

           在Struts 2struts.properties配置文件中,我們可以看到如下配置代碼,它主要用于配置Struts 2上傳文件時的上傳解析器

#指定使用cos的文件上傳解析器

    struts.multipart.parser=cos

    #指定使用Pell的文件上傳解析器

    struts.multipart.parser=pell

   #Struts 2默認使用Jakarta的common-FileUpload的文件上傳解析器

    struts.multipart.parser=jakarta

           下面將以Struts 2默認的文件上傳支持為例:

           對于上傳頁面,為了完成文件上傳,我們應該講這個表單域的enctype屬性設置為“multipart/form-data”,method屬性設置為“POST

            如下:

<s:form action="upload" enctype="multipart/form-data" method="post">
        <s:textfield name="title" label="文件標題"></s:textfield><br/>
        <s:file name="upload" label="選擇文件"></s:file>
        <s:submit value="上傳"></s:submit>
    </s:form>

           當該頁面提交請求時,請求發送到upload.action。這是Struts 2的一個Action。

 

           實現文件上傳的Action          

            Struts 2的Action無須負責處理HttpServletRequest請求。Struts 2框架負責解析HttpServletRequest請求中的參數,包括文件域,Struts 2使用File類型來封裝文件域。

           處理上傳請求的Action類代碼:

public class UploadAction extends ActionSupport {

    private String title;                     // 封裝文件標題請求參數
    private File upload;                      // 上傳文件域
    private String uploadContentType;         // 上傳文件的類型
    private String uploadFileName;             // 上傳文件名的屬性

    // 直接在struts.xml文件中配置的屬性
    private String savePath;

    // 接受struts.xml文件配置值的方法

    public void setSavePath(String savePath) {
        this.savePath = savePath;
    }

    // 返回上傳文件的保存位置
    private String getSavePath() throws Exception {
        return ServletActionContext.getServletContext().getRealPath(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;
    }

    @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提供了兩個屬性:uploadFileName和uploadContentType,這個兩個屬性分別用于封轉上傳文件的文件名、上傳文件的文件類型。Action類直接通過File類型屬性直接封裝了上傳文件的文件內容,但是這個File屬性無法獲取上傳文件的文件名和類型,所以Struts 2直接將文件域中包含的上傳文件名和文件類型的信息封裝到uploadFileName和uploadContentType屬性中,。可以認為:如果表單中包含一個name屬性為XXX的文件域,則對應Action需要使用三個屬性來封裝該文件域的信息

           1、類型為File的xxx屬性封裝另外該文件域對應的文件內容。

           2、類型為String的xxxFileName屬性封裝了該文件域對應的文件名。

           3、類型為String的xxxContentType屬性封裝了該文件域對應的文件的文件類型。

           通過上面的3個屬性,可以更簡單地實現文件屬性,所以在execute方法中,可以直接通過調用getXxx()方法來獲取上傳文件的文件名、文件類型和文件內容

 

          配置文件上傳的Action

           配置該Action時,還需要配置一個<param.../>元素,該元素用于為該Action的屬性動態分配屬性值:

<package name="uploadaction" extends="struts-default">
        <action name="upload" class="com.app.action.UploadAction">
            <!-- 動態設置Action的屬性值 -->
            <param name="savePath">/upload</param>
            <result name="success">/success.jsp</result>
        </action>
    </package>


           配置了改Action應用后,我們就可以上傳文件了。該上傳請求將會被UploadAction處理,處理結束后會轉入到success.jsp頁面中,該頁面主要是用于顯示上傳的圖片,來驗證是否上傳成功

上傳成功!!<br />
    文件標題:<s:property value="+title"/>
    文件為:<img src="<s:property value="'upload/'+uploadFileName"/>"><Br />


         如果上傳成功就可以看到如許頁面:

讀李剛《輕量級Java EE企業應用實戰》

 

來自: http://blog.csdn.net/chenssy/article/details/7341878

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!