文件上傳與下載(四)Struts2 實(shí)現(xiàn)

這一部分使用Struts2實(shí)現(xiàn)文件的上傳與下載。

必須條件:
前臺form表單<code>method="post" enctype="multipart/form-data"</code>

Struts2在原有的上傳解析器繼承上做了進(jìn)一步封裝褒搔,更進(jìn)一步簡化了文件上傳脸甘。

Struts2默認(rèn)使用的是Common-FileUpload的文件上傳框架恳啥,因此,如果需要使用Struts2的文件上傳功能丹诀,需要在web應(yīng)用中導(dǎo)入相應(yīng)的jar包钝的。

Action需要使用三個屬性來封裝該文件域的信息:

  1. 類型為File的xxx屬性封裝了該文件域?qū)?yīng)的文件的文件內(nèi)容。

  2. 類型為String的xxxFileName屬性封裝了該文件域?qū)?yīng)的文件的文件名稱铆遭。

  3. 類型為String的xxxContentType屬性封裝了該文件域?qū)?yīng)的文件的文件類型硝桩。

關(guān)鍵:
struts.xml配置攔截器,設(shè)置允許上傳類型枚荣、文件大小等信息碗脊。


上傳單個文件

web.xml

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

前臺頁面:

        <h2>Struts2上傳</h2>
        <s:form action="doUpload.action" method="post" enctype="multipart/form-data">
            <s:file name="upload" label="File"/>
            <s:submit value="上傳"/>${strutsResult}
        </s:form>

在jsp頁面中增加Struts2的標(biāo)簽庫。

<%@ taglib uri="/struts-tags" prefix="s"%>  

編寫UploadAction

public class UploadAction extends ActionSupport {
    
    //文件內(nèi)容(要與前臺的name屬性值一致)
    private File upload;
    //文件類型
    private String uploadContentType;
    //文件名稱
    private String uploadFileName;
    //返回消息提示
    private String strutsResult;
    
    
    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 getStrutsResult() {
        return strutsResult;
    }


    public void setStrutsResult(String strutsResult) {
        this.strutsResult = strutsResult;
    }


    public String execute() throws IOException {
        //獲取服務(wù)器上傳文件存放路徑
        String path = ServletActionContext.getServletContext().getRealPath("/upload");
        File file = new File(path);
        if (!file.exists()) {
            file.mkdir();
        }
        FileUtils.copyFile(upload, new File(file, uploadFileName));
        strutsResult = "上傳成功";
        
        return SUCCESS;
    }
}

上面的三個基本屬性封裝重要的信息橄妆。

接下來來配置struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />

    <package name="default" namespace="/" extends="struts-default">

        <action name="doUpload" class="com.meng.action.UploadAction">
            <result name="success">/index.jsp</result>
            <!-- 配置攔截器限制上傳文件類型及大小 -->
            <interceptor-ref name="fileUpload">
                <param name="allowedType">image/bmp,image/x-png,image/gif,image/jpeg</param>
                <param name="maximumSize">2M</param>
            </interceptor-ref>
            <interceptor-ref name="basicStack"></interceptor-ref>
        </action>
    </package>

</struts>

多文件上傳(批量上傳)

修改前臺頁面

    <h2>上傳多個文件</h2>
    <s:form action="doUpload.action" method="post" enctype="multipart/form-data">
        <s:file name="upload" label="File"/>
        <s:file name="upload" label="File"/>
        <s:file name="upload" label="File"/>
        <s:submit value="上傳"/>${strutsResult}
    </s:form>   

UploadAction

public class UploadAction extends ActionSupport {

    // 文件內(nèi)容
    private List<File> upload;
    // 文件類型
    private List<String> uploadContentType;
    // 文件名稱
    private List<String> uploadFileName;
    // 返回消息提示
    private String strutsResult;

    public List<File> getUpload() {
        return upload;
    }

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

    public List<String> getUploadContentType() {
        return uploadContentType;
    }

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

    public List<String> getUploadFileName() {
        return uploadFileName;
    }

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

    public String getStrutsResult() {
        return strutsResult;
    }

    public void setStrutsResult(String strutsResult) {
        this.strutsResult = strutsResult;
    }

    public String execute() throws IOException {
        // 獲取服務(wù)器上傳文件存放路徑
        String path = ServletActionContext.getServletContext().getRealPath("/upload");
        File file = new File(path);
        if (!file.exists()) {
            file.mkdir();
        }
        for (int i = 0; i < upload.size(); i++) {
            FileUtils.copyFile(upload.get(i), new File(file, uploadFileName.get(i)));
        }
        strutsResult = "上傳成功";

        return SUCCESS;
    }

}

這樣就能成功的完成上傳的功能衙伶。


文件的下載

通常情況下,我們在下載文件的時候害碾,文件的路徑都是股固定的矢劲。

所以實(shí)現(xiàn)起來也是比較簡單的。

在前臺給定一個連接

<h2>Struts2下載</h2>
<a href="doDownload.action">下載</a>

然后配置struts.xml慌随,添加如下配置:

<action name="doDownload" class="com.meng.action.download.DownloadAction">
    <param name="inputPath">/upload/10.jpg</param>
    <result name="success" type="stream">
        <param name="contentType">application/octet-stream</param>
        <param name="inputName">inputStream</param>
        <param name="contentDisposition">attachment;filename="10.jpg"</param>
        <param name="bufferSize">8192</param>
    </result>
 </action>  

編寫DownloadAction

public class DownloadAction extends ActionSupport {
    
    private String inputPath;

    public String getInputPath() {
        return inputPath;
    }

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

    @Override
    public String execute() throws Exception {
        
        return SUCCESS;
    }
    
    public InputStream getInputStream() {
        
        return ServletActionContext.getServletContext().getResourceAsStream(inputPath);
        
    }
}

當(dāng)我們點(diǎn)擊連接的時候卧须,就會下載我們所給定的文件。

但是這樣配置很是不方便儒陨,我們可以通過URL來給定所要下載的文件名稱花嘶。

將上面的代碼進(jìn)行修改:

<a href="doDownload.action?filename=10.jpg">下載</a>
<action name="doDownload" class="com.meng.action.download.DownloadAction">
    <result name="success" type="stream">
        <param name="contentType">application/octet-stream</param>
        <param name="inputName">inputStream</param>
        <param name="contentDisposition">attachment;filename="${downloadFileName}"</param>
        <param name="bufferSize">8192</param>
    </result>
 </action>  
public class DownloadAction extends ActionSupport {
    
    private String filename;
    
    public String getFilename() {
        return filename;
    }

    public void setFilename(String filename) {
        this.filename = filename;
    }

    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }
    
    public InputStream getInputStream() throws IOException {
        
        String path = ServletActionContext.getServletContext().getRealPath("/upload");
        String filepath = path + "\\" + filename;
        File file = new File(filepath);
        return FileUtils.openInputStream(file);
    }
    
    public String getDownloadFileName() {
        String downloadFileName = "";
        try {
            // 轉(zhuǎn)換下中文的文件名的的編碼
            downloadFileName = URLEncoder.encode("文件下載.jpg", "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return downloadFileName;
    }
}

這樣配置是不是用起來的時候會方便的多。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蹦漠,一起剝皮案震驚了整個濱河市椭员,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌笛园,老刑警劉巖隘击,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侍芝,死亡現(xiàn)場離奇詭異,居然都是意外死亡埋同,警方通過查閱死者的電腦和手機(jī)州叠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凶赁,“玉大人咧栗,你說我怎么就攤上這事∈蓿” “怎么了致板?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長咏窿。 經(jīng)常有香客問我斟或,道長,這世上最難降的妖魔是什么集嵌? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任萝挤,我火速辦了婚禮,結(jié)果婚禮上根欧,老公的妹妹穿的比我還像新娘怜珍。我一直安慰自己,他們只是感情好咽块,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布绘面。 她就那樣靜靜地躺著欺税,像睡著了一般侈沪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晚凿,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天亭罪,我揣著相機(jī)與錄音,去河邊找鬼歼秽。 笑死应役,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的燥筷。 我是一名探鬼主播箩祥,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肆氓!你這毒婦竟也來了袍祖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谢揪,失蹤者是張志新(化名)和其女友劉穎蕉陋,沒想到半個月后捐凭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凳鬓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年茁肠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缩举。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡垦梆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚁孔,到底是詐尸還是另有隱情奶赔,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布杠氢,位于F島的核電站站刑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鼻百。R本人自食惡果不足惜绞旅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望温艇。 院中可真熱鬧因悲,春花似錦、人聲如沸勺爱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽琐鲁。三九已至卫旱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間围段,已是汗流浹背顾翼。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奈泪,地道東北人适贸。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像涝桅,于是被迫代替她去往敵國和親拜姿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容