Struts2攔截器的應用:文件上傳

1、單文件上傳

1.1 處理文件上傳的Action類

public class UpLoadAction extends ActionSupport{
    private File upload;                  //封裝上傳文件 xxx
    private String uploadContentType;     //封裝上傳文件類型xxxContentType固定寫法
    private String uploadFileName;        //封裝上傳文件名xxxFileName固定寫法
    private String savePath;              //封裝上傳文件在服務器tomcat容器上的保存路徑
    private FileInputStream fileInput;
    private FileOutputStream fileOutput;

    public File getUpload() {
        return upload;
    }
    public void setUpload(File upload) {
        this.upload = upload;
    }
    public String getUploadContentType() {
        return uploadContentType;
    }
    public void setUploadContentType(String uploadContentType) {
        this.uploadContentType = uploadContentType;
    }
    public String getUploadFileName() {
        return uploadFileName;
    }
    public void setUploadFileName(String uploadFileName) {
        this.uploadFileName = uploadFileName;
    }

    public String getSavePath(){
        //以下ServletActionContext.getServletContext().getRealPath(“”)方法獲取本工程在tomcat容器中的真實絕對路徑,加上參數savepath,進一步得到下一級savepath的絕對路徑
        String realpath = ServletActionContext.getServletContext().getRealPath(savePath);
        return realpath;
    }

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

    public String execute() throws Exception{
        upload.getAbsolutePath();
        fileInput = new FileInputStream(getUpload());     //創建文件輸入流
        fileOutput = new FileOutputStream(getSavePath() + "\\" + getUploadFileName());  //創建文件輸出流
        byte[] b = new  byte[2048];    //緩衝數組大小2KB
        int len = 0;
        while((len=fileInput.read(b))>0)    //finout.read(b)實現從輸入流讀2KB數據到數組b中,返回讀取的字節數len,遇到文件尾返回-1
        {
            fileOutput.write(b,0,len);     //將b中len字節數據寫到輸出流中
        }
        fileInput.close();              //關閉輸入流
        fileOutput.close();              //關閉輸出流
        return "success";
    }
}

1.2 JSP上傳頁面

<s:form action="upload"  enctype="multipart/form-data">
     選擇文件:<s:file name="upload" ></s:file>
     <s:submit  value="上傳"></s:submit>
</s:form>
//其他頁面(略)

1.3 struts配置

//struts.xml
<struts>
    <constant name="struts.devMode" value="false" />
     <include file="struts-default.xml" />  

    <package name="up-load" extends="struts-default">
        <action name="upload" class="com.action.UpLoadAction">
            <param name="savePath">/uploadAdd</param>  <!-- 部署本工程前,要在WebRoot下手工創建文件夾uploadAdd,保存的文件 -->
            <result name="success">upsuccess.jsp</result>
            <result name="input">uperror.jsp</result><!--攔截不通過自動返回"input"視圖-->
            <interceptor-ref name="fileUpload">
                <param name="allowedTypes">
                    image/gif,image/jpeg,image/x-png,image/bmp
                </param>   <!-- 允許上傳的文件類型 -->
                <param name="maximumSize">2048000</param>   <!-- 限制上傳文件大小爲2048000字節  --> 
            </interceptor-ref>
            <interceptor-ref name="defaultStack"/> <!--在內置攔截器後面引用 -->           
        </action>

    </package>
</struts>

2、多文件上傳

2.1 處理文件上傳的action類

public class UploadAction extends ActionSupport {
    private List<File> files;//xxx
    private List<String> filesFileName;//xxxFileName
    private List<String> filesContentType;//xxxContentType
    private String savedPath;

    public List<File> getFiles() {
        return files;
    }
    public void setFiles(List<File> files) {
        this.files = files;
    }
    public List<String> getFilesFileName() {
        return filesFileName;
    }
    public void setFilesFileName(List<String> filesFileName) {
        this.filesFileName = filesFileName;
    }
    public List<String> getFilesContentType() {
        return filesContentType;
    }
    public void setFilesContentType(List<String> filesContentType) {
        this.filesContentType = filesContentType;
    }

    public String getSavedPath() {
        String realPath=ServletActionContext.getServletContext().getRealPath(savedPath);
        return realPath;
    }
    public void setSavedPath(String savedPath) {
        this.savedPath = savedPath;
    }
    public String execute(){
        try{
            for(int i=0;i<files.size();i++){
                OutputStream out=new FileOutputStream(new File(this.getSavedPath(),filesFileName.get(i)));

                InputStream in=new FileInputStream(files.get(i));
                byte [] buff=new byte[1024];
                int len=0;
                while(-1!=(len=in.read(buff))){
                    out.write(buff,0,len);
                }
                in.close();
                out.close();
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
        return "success";
    }
}

2.2 JSP上傳頁面

<h3>多文件上傳</h3>
<s:form action="upload" enctype="multipart/form-data">
    <s:file name="files"></s:file>
    <s:file name="files"></s:file>
    <s:submit value="上傳"></s:submit>
</s:form>

2.3 struts配置

//struts.xml
<struts>    
    <constant name="struts.devMode" value="false" />
    <include file="struts-default.xml"/>

    <package name="File" extends="struts-default">
        <action name="upload" class="com.action.UploadAction">
            <param name="savedPath">/uploadedfiles</param>
            <result name="success">upload_success.jsp</result>

            <interceptor-ref name="fileUpload">
                <param name="allowedTypes">image/gif,image/jpeg,image/x-png,image/bmp</param>
                <param name="maximumSize">10240000</param>
            </interceptor-ref>
            <interceptor-ref name="defaultStack"/>
        </action>
    </package>
</struts>    

2.4 上傳成功頁面

//顯示上傳的圖片
<h3>上傳成功</h3>
上傳的文件:<br>
<s:iterator value="filesFileName" id="filename">
    <s:property value="#filename"/>
    <img src="uploadedfiles/<s:property value='#filename'/>" width="150" height="70"/>
    <br>
</s:iterator>
發佈了31 篇原創文章 · 獲贊 37 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章