<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    最愛Java

    書山有路勤為徑,學海無涯苦作舟

    Struts2學習筆記 —— 上傳和下載

        Struts2默認使用Jakarta的Common-FileUpload的文件上傳解析器。見struts.properties配置文件中:

    #指定使用COS的文件上傳解析器
    #struts.multipart.parser
    =cos
    #指定使用Pell的文件上傳解析器
    #struts.multipart.parser
    =pell
    #指定使用Common-FileUpload的文件上傳解析器
    struts.multipart.parser
    =jakarta


       實際上,Struts2的文件上傳功能只是在原有的文件上傳項目上做了進一步的封裝,取消了不同文件上傳項目的編程差異而已。

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;

    import com.opensymphony.xwork2.ActionSupport;

    public class UploadAction extends ActionSupport {

        
    private static final long serialVersionUID = -3921956808689128362L;
        
    //封裝文件標題請求參數的屬性
        private String title;
        
    //封裝上傳文件域的屬性
        private File upload;
        
    //封裝上傳文件類型的屬性
        private String uploadContentType;
        
    //封裝上傳文件名的屬性
        private String uploadFileName;
        
    //直接在struts.xml文件中配置的屬性
        private String 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;
        }

        
    //接收struts.xml文件配置值的方法
        public String getSavePath() {
            
    return savePath;
        }

        
    //返回上傳文件保存位置
        public void setSavePath(String savePath) {
            
    this.savePath = savePath;
        }

        
        @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和普通的Action沒有任何區別。只是多了幾個屬性而已。如果表單中包含一個name屬性為xxx的文件域,則對應的Action需要使用3個屬性來封裝該文件域的信息:類型為File的xxx屬性封裝了該文件的內容;類型為String的xxxFileName屬性封裝了該文件域對應的文件的文件名;類型為String的xxxContentType屬性封裝了該文件域對應的文件類型。除此之外,配置了savePath來依賴注入文件上傳后的保存地址。具體的Action配置如下:

    <?xml version="1.0" encoding="GBK"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation/ /DTD Struts Configuration 2.1/ /EN"
        "http://struts.apache.org/dtds/struts-2.1.dtd"
    >
    <struts>
        
    <package name="strutsqs" extends="struts-default">
            
    <action name="upload" class="com.struts.test.action.UploadAction">
        
    <param name="savePath">/upload</param>        <result>/succ.jsp</result>
            
    </action>
        
    </package>
    </struts>


        一般我們上傳文件都不是無限制地上傳的,需要制定一些例如文件類型,文件大小等限制。我們可以通過配置Struts2中的攔截器進行文件過濾。Struts2中文件上傳的攔截器是fileUpload。配置fileUpload攔截器,可以為其指定兩個參數:

        allowedTypes:該參數指定允許上傳文件的類型,多了文件類型之間以英文逗號隔開。

        maximuxSize:該參數指定允許上傳文件大小,單位是字節。

        通過配置fileUpload攔截器,可以輕松地實現文件過濾,當文件過濾失敗后,系統自動轉入input視圖。當然,我們必須顯式地為該Action配置defaultStack的攔截器引用。

    <?xml version="1.0" encoding="GBK"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation/ /DTD Struts Configuration 2.1/ /EN"
        "http://struts.apache.org/dtds/struts-2.1.dtd"
    >
    <struts>
        
    <package name="strutsqs" extends="struts-default">
            
    <action name="upload" class="com.struts.test.action.UploadAction">
                
    <interceptor-ref name="fileUpload">
                                
    <param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param>
                                
    <param name="maximumSize">2000</param>
                            
    </interceptor-ref>
                            
    <interceptor-ref name="defaultStack"/>
                            
    <param name="savePath">/upload</param>
                
    <result name="input">/upload.jsp</result>
                
    <result>/succ.jsp</result>
            
    </action>
        
    </package>
    </struts>


        如果需要使用Pell上傳, 需要使用插件struts2-pell-multipart-plutin-2.1.6.jar文件。此壓縮包中有一個PellMultiPartRequest類。同時在struts-plugin.xml中有如下Bean配置:

             <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="pell" class="org.apache.struts2.dispatcher.multipart.PellMultiPartRequest" />
       指明了解析接口的實現類。有了這個聲明,我們只需在struts.xml中顯式地聲明一下sturts.multipart.parser的值為pell即可:

             <constant name="struts.multipart.parser" value="pell"/>

             說道此處,上傳基本說完了。如果需要同時上傳多了文件,只要將Action中涉及文件上傳的屬性聲明為數組或List即可。

             Struts2的文件下載也和普通Action沒有區別,只是返回的是InputStream流而已。

    import java.io.InputStream;

    import com.opensymphony.xwork2.ActionSupport;
    import org.apache.struts2.ServletActionContext;

    public class FileDownloadAction extends ActionSupport {

        
    private static final long serialVersionUID = 7160810536224371999L;
        
    //該屬性是依賴注入的屬性,可以在配置文件中動態指定該屬性值
        private String inputPath;

        
    public String getInputPath() {
            
    return inputPath;
        }


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

        
        
        
    public InputStream getTargetFile() throws Exception {
             
    return ServletActionContext.getServletContext().getResourceAsStream(inputStream);
        }

    }


        代碼很簡單,關鍵是需要配置stream類型的結果。配置stream類型的結果需要指定如下4個屬性:

    • contentType:指定被下載文件的文件類型
    • inputName:指定被下載文件的入口流入流
    • contentDisposition:指定下載的文件名
    • bufferSize:指定下載文件時的緩沖大小

         

    <action name="download" class="com.struts.test.action.DownloadAction">
        
    <param name="inputPath">\images\t.jpg</param>
        
    <result name="success" type="stream">
            
    <param name="contentType">image/jpg</param>
            
    <!-- 指定getTargetFile()方法返回被下載文件的InputStream-->
            
    <param name="inputName">targetFile</param>
            
    <param name="contentDisposition">filename="wjc_lgo.jpg"</param>
            
    <param name="bufferSize">4096</param>
        
    </result>
    </action>

    posted on 2010-11-07 14:19 Brian 閱讀(475) 評論(0)  編輯  收藏 所屬分類: Struts2

    公告


    導航

    <2010年11月>
    31123456
    78910111213
    14151617181920
    21222324252627
    2829301234
    567891011

    統計

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    收藏夾

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 美女视频黄频a免费| 亚洲久悠悠色悠在线播放| 特级毛片aaaa级毛片免费| 毛片A级毛片免费播放| 亚洲不卡中文字幕| 中国在线观看免费高清完整版| 亚洲视频精品在线| 91视频免费网址| 亚洲美女一区二区三区| 国产精品免费精品自在线观看| 亚洲w码欧洲s码免费| 成年在线观看免费人视频草莓| 伊人久久五月丁香综合中文亚洲| 国产在线国偷精品产拍免费| 中文字幕乱码亚洲无线三区| 国产一级淫片免费播放| 日韩在线观看免费完整版视频| 久久久无码精品亚洲日韩软件| 永久在线观看免费视频 | 中文字幕亚洲激情| 91成人免费观看在线观看| 亚洲va在线va天堂va不卡下载 | 我想看一级毛片免费的| 男男gvh肉在线观看免费| 久久精品国产亚洲7777| 国内精品免费在线观看| 亚洲麻豆精品果冻传媒| 免费理论片51人人看电影| 一级做a毛片免费视频| 亚洲成a人片在线观看无码| 99久久久精品免费观看国产| 亚洲Av永久无码精品一区二区| 亚洲成人一区二区| 99久久免费观看| 亚洲精品伦理熟女国产一区二区| 国产日产亚洲系列最新| 免费专区丝袜脚调教视频| 美女无遮挡免费视频网站| 日产亚洲一区二区三区| 又粗又黄又猛又爽大片免费| 91福利视频免费|