<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)

    隨筆分類

    隨筆檔案

    收藏夾

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲精品乱码久久久久久按摩 | 国产va在线观看免费| 永久在线免费观看| 永久黄网站色视频免费观看| 亚洲一区精品无码| 亚洲精品天堂成人片AV在线播放| 野花香高清在线观看视频播放免费 | 亚洲精品美女久久777777| 中国videos性高清免费| 午夜寂寞在线一级观看免费| 亚洲欧美日韩中文字幕一区二区三区 | 成人影片麻豆国产影片免费观看| 亚洲女久久久噜噜噜熟女| 人妻在线日韩免费视频| 免费一级毛片女人图片| 狠狠色香婷婷久久亚洲精品| 国产成人AV片无码免费| 亚洲黄色片在线观看| 四虎影视无码永久免费| 亚洲偷自拍拍综合网| 国产精品亚洲一区二区三区| 精品熟女少妇AV免费观看| 亚洲爆乳大丰满无码专区| 亚洲人成人网站在线观看| 爱情岛论坛亚洲品质自拍视频网站| 久久久久久国产精品免费免费 | 亚洲国产成人久久一区二区三区| 免费国产成人午夜私人影视 | 中文字幕高清免费不卡视频| 亚洲高清免费在线观看| 狼友av永久网站免费观看| 男女啪啪免费体验区| 日本免费v片一二三区| 亚洲啪AV永久无码精品放毛片| 亚洲av区一区二区三| 国产精品亚洲综合| 亚洲国产成人一区二区三区| 可以免费观看的毛片| 亚洲另类无码专区首页| 亚洲深深色噜噜狠狠爱网站| 成年免费大片黄在线观看岛国|