Struts2 檔案上傳和檔案下載

來源:互聯網
上載者:User

標籤:

一.單個檔案上傳

檔案上傳需要兩個jar包:

 

首先製作一個簡單的頁面,用於實現檔案上傳

<h1>單個檔案上傳</h1>        <s:form action="upload.action" enctype="multipart/form-data"            method="post" namespace="/">            <s:textfield name="title" lable="標題"></s:textfield>            <s:file name="upload" lable="選擇檔案"></s:file>            <s:submit value="上傳檔案"></s:submit>        </s:form>

開發實現檔案上傳的Action

package cn.action;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;public class UploadAction  extends ActionSupport{    //封裝上傳檔案屬性        private File upload;                //封裝上傳檔案的類型        private String uploadContentType;                //封裝上傳檔案名稱        private String uploadFileName;                //封裝檔案上傳的路徑        private String savePath;        public String execute(){            byte[] buffer=new byte[1024];            try {                FileInputStream fis=new FileInputStream(getUpload());                FileOutputStream fos=new FileOutputStream(getSavePath()+"\\"+this.getUploadFileName());                int length=fis.read(buffer);                while(length>0){                    fos.write(buffer, 0, length);                    length=fis.read(buffer);                }                fos.flush();                fos.close();                fis.close();            } catch (FileNotFoundException e) {                                e.printStackTrace();            } catch (IOException e) {                                e.printStackTrace();            }            System.out.println("========================");            return SUCCESS;        }                        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() {            return ServletActionContext.getServletContext().getRealPath(savePath);        }        public void setSavePath(String savePath) {            this.savePath = savePath;        }        }

在Action中使用了三個屬性封裝檔案資訊

File類型的XXX屬性,與表單的File控制項的name屬性一樣,用於封裝File控制項對應的檔案內容

String類型的xxxFileName屬性,該屬性名稱由前面的File類型屬性和FileName組合,是固定的文法,是封裝File控制項對應檔案的檔案名稱

String類型的XXXContentType屬性,同樣由xxx屬性和ContentType組合而成,是固定文法,封裝File控制項對應檔案的檔案類型

 

 

配置Action

<!-- 單個檔案上傳 -->        <action name="upload" class="cn.action.UploadAction">            <!-- 通過param參數設定儲存目錄的路徑 -->            <param name="savePath">/upload</param>            <result name="success">success.jsp</result>        </action>

 

 

 

二.多個檔案上傳

只需在上傳Action中將原本處理單個檔案的操作改成對集合操作即可。

其他的都跟單個上傳的一樣

頁面

<!-- 多個檔案上傳 -->        <action name="someupload" class="cn.action.SomeUploadAction">            <!-- 通過param參數設定儲存目錄的路徑 -->            <param name="savePath">/upload</param>            <result name="success">success.jsp</result>        </action>

開發實現檔案上傳的Action

package cn.action;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;public class SomeUploadAction extends ActionSupport {    //封裝上傳檔案屬性        private File[] upload;                //封裝上傳檔案的類型        private String[] uploadContentType;                //封裝上傳檔案名稱        private String[] uploadFileName;                //封裝檔案上傳的路徑        private String savePath;                        public String execute() throws Exception{            byte[] buffer=new byte[1024];            for (int i = 0; i < upload.length; i++) {                FileInputStream fis=new FileInputStream(getUpload()[i]);                FileOutputStream fos=new FileOutputStream(getSavePath()+"\\"+this.getUploadFileName()[i]);                int length=fis.read(buffer);                while(length>0){                    fos.write(buffer, 0, length);                    length=fis.read(buffer);                }                fos.flush();                fos.close();                fis.close();            }            return SUCCESS;        }        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() {            return ServletActionContext.getServletContext().getRealPath(savePath);        }        public void setSavePath(String savePath) {            this.savePath = savePath;        }        }

配置Action

<!-- 多個檔案上傳 -->        <action name="someupload" class="cn.action.SomeUploadAction">            <!-- 通過param參數設定儲存目錄的路徑 -->            <param name="savePath">/upload</param>            <result name="success">success.jsp</result>        </action>
效果:

 

 

 

 三.檔案下載

檔案下載需要InputStream,首先在檔案下載Action中提供一個獲得InputStream的方法,通過輸入資料流可以擷取希望下載的檔案內容

package cn.action;import java.io.BufferedInputStream;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.InputStream;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;public class FileDownAction extends ActionSupport {    //讀取下載檔案的目錄        private String inputPath;                //下載檔案的檔案名稱        private String fileName;                //讀取下載檔案的輸入資料流        private InputStream inputStream;                //下載檔案的類型        private String conetntType;                                                public String execute(){            return SUCCESS;                    }        public String getInputPath() {            return inputPath;        }        public void setInputPath(String inputPath) {            this.inputPath = inputPath;        }        public String getFileName() {            return fileName;        }        public void setFileName(String fileName) {            this.fileName = fileName;        }        //建立InputStream輸入資料流        public InputStream getInputStream() throws Exception {            String path=ServletActionContext.getServletContext().getRealPath(inputPath);            BufferedInputStream stream = new BufferedInputStream(new FileInputStream(path+"\\"+fileName));            return stream;        }        public void setInputStream(InputStream inputStream) {            this.inputStream = inputStream;        }        public String getConetntType() {            return conetntType;        }        public void setConetntType(String conetntType) {            this.conetntType = conetntType;        }                }

通過Context得到下載檔案的實際路徑,構建一個InputStream輸入資料流實現檔案的下載讀取。

在設定檔中,同樣對Action進行配置,並對stream結果類型的參數進行設定。

<!-- download指定的Action -->        <action name="download" class="cn.action.FileDownAction">            <param name="inputPath">/upload</param>            <result name="success" type="stream">                <param name="contentType">application/octet-stream</param>                <param name="inputName">inputStream</param>                <param name="contentDisposition">                    attachment;filename="${fileName}"                </param>                <param name="bufferSize">4096</param>            </result>        </action>

ContentType參數決定了下載檔案的類型,不同的檔案類型對應的參數值也是不同的。

 

通常情況下,ContentType參數直接設定為application/octet-stream即可。

contentDisposition參數由兩部分組成,前面的部分表示處理檔案的形式,如attachement表示在下載時彈出對話方塊,提出使用者儲存或直接開啟該檔案;而後一部分表示下載檔案的檔案名稱。兩部分之間用“;”進行分隔。

然後開發一個簡單的下載頁面,在頁面中設定一個超連結,通過超連結請求下載Action

<h1>檔案下載</h1>        <s:a href="download.action?fileName=2.jpg">點擊此處下載檔案</s:a>

 效果:

Struts2 檔案上傳和檔案下載

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.