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

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

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

    Struts2中使用Common-FileUpload實現文件上傳

    Posted on 2008-02-16 18:59 flustar 閱讀(9662) 評論(9)  編輯  收藏 所屬分類: Struts2
     

    web應用中,文件上傳似乎是很常見的,但是采用傳統的方法不但復雜而且難以控制,需要寫很多代碼,像控制文件大小、文件類型的過濾、存放目錄等等。這些復雜的問題在Struts2中已經不存在了,struts2默認使用common-fileupload實現文件的上傳。在struts.properties中我們可以看到:struts.multipart.parser=Jakarta 。下面我們就以Common-FileUpload來實現文件上傳。

    首先,把commons-fileupload.jarcommons-io.jar拷貝到classpath路徑下。

    建立一個上傳文件的頁面,upload.jsp。

    <%@ page contentType="text/html; charset=utf-8" %>
    <%@taglib prefix="s" uri="/struts-tags"%>
    <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" > 
    <html xmlns ="http://www.w3.org/1999/xhtml" > 
    <head> 
        
    <title> Struts 2 File Upload </title > 
    </head > 
    <body >
        
    <div style="color.red">
            
    <s:fielderror /> 
        
    </div>
        
    <s:form action ="upload" method ="post" enctype ="multipart/form-data" > 
            
    <s:textfield name ="title" label ="文件標題" /> 
            
    <s:file name ="upload" label ="選擇文件" />      
            
    <s:submit value="上傳" /> 
        
    </s:form>
    </body > 
    </html > 


    上傳成功后的succ.jsp

    <%@ page contentType="text/html;charset=utf-8" %>
    <%@ taglib prefix="s" uri="/struts-tags"%>
    <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" > 
    <html xmlns ="http://www.w3.org/1999/xhtml" > 
    <head> 
        
    <title> Struts 2 File Upload </title > 
    </head> 
    <body> 
        
    <div style ="padding: 3px; border: solid 1px #cccccc; text-align: center" > 
            
    <img src ='upload/<s:property value ="uploadFileName" /> ' />
            
    <br /> 
            
    <s:property value ="title" /> 
        
    </div > 
    </body > 
    </html > 


    然后編寫UploadAction.java

    /** 
     *
     * 
    @author <a href="mailto:flustar2008@163.com">flustar</a>
     * 
    @version 1.0 
     * Creation date: Feb 15, 2008 10:24:36 PM
     
    */

    package test;

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

    import org.apache.struts2.ServletActionContext;

    import com.opensymphony.xwork2.ActionSupport;

    public class UploadAction extends ActionSupport{
        
    private static final long serialVersionUID = -7887613751080170362L;
        
    private String title;//設置上傳文件的標題
        private File upload;//封裝上傳文件
        private String uploadFileName;//設置上傳文件的文件名
        private String uploadContentType;//上傳文件的類型
        private String savePath;//上傳文件的保存路徑
        public String getTitle() {
            
    return title;
        }

        
    public void setTitle(String title) {
            
    this.title = title;
        }

        
    public File getUpload() {
            
    return upload;
        }

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

        
        
    public String getUploadFileName() {
            
    return uploadFileName;
        }

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

        
    public String getUploadContentType() {
            
    return uploadContentType;
        }

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

        
    public String getSavePath() {
            System.out.println(ServletActionContext.getServletContext().getRealPath(savePath));
            
    return ServletActionContext.getServletContext().getRealPath(savePath);
        }

        
    public void setSavePath(String savePath) {
            
    this.savePath = savePath;
            System.out.println(
    "savePath: "+savePath);
        }

        
    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;
        }

    }


    編寫struts.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd"
    >
    <struts>
        
    <package name="blog" extends="struts-default">
            
    <action name="upload" class="test.UploadAction">
                
    <!-- Struts2內置的文件上傳攔截器 -->
                
    <interceptor-ref name="fileUpload">
                    
    <param name="allowedTypes">image/bmp,image/x-png,image/gif,image/pjpeg</param>
                    
    <param name="maximumSize">2048000</param>
                
    </interceptor-ref>
                
    <interceptor-ref name="defaultStack" />
                
    <param name="savePath">/upload</param>
                
    <result>/succ.jsp</result>
                
    <result name="input">/upload.jsp</result>
            
    </action>
            
    </package>
            
    </struts>


    編寫struts.properties

     

    struts.custom.i18n.resources=mess

    struts.multipart.parser
    =jakarta

    struts.multipart.maxSize
    =10000000

     

    編寫國際化的資源文件mess.properties

     

    struts.messages.error.content.type.not.allowed="Thetypeisnotbeallowed!"

    struts.messages.error.file.too.large
    ="Thefileistoolarge!"

    struts.messages.error.uploading
    ="unknownerror"

     

    在這里我沒有把調試的過程寫出來,這完全沒必要,網上已經有很多這方面的例子了,但是網上好多例子都有一個通病,那就是錯誤的信息實在是太多了,都是搜索引擎惹得禍。按照上面的步驟來做,很難成功!我按照上面的步驟來操作,發現兩個比較普遍的錯誤:

    1) 不能上傳pngjpg類型的圖片。解決辦法可以參考上面的struts.xml

    2) 上傳過大的文件沒有提示信息,而是直接拋出下面的異常:

       org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (2359629) exceeds the configured maximum (2097152)

    為什么會出現這個錯誤?剛開始我還以為是Struts2的一個bug,于是我就開始研究是struts2內置的fileUpload攔截器,我研究了FileUploadInterceptor.java的源代碼并調試了半天依然不能解決這個問題,我都被它快折磨死了。最后我想起了在我們編寫struts.properties中有這么一句struts.multipart.parser=Jakarta,實際上這一句也可以不寫因為這是struts2為了支持文件上傳默認的。那么這個Jakarta到底是什么東西呢?實際上Jakarta實際上就是org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest類。打開JakartaMultiPartRequest.java的源代碼你會發現這個類實現了MultiPartRequest接口,在這個類封裝了對底層ServletFileUpload的操作,由于common-fileupload組件默認最大支持上傳文件的大小為2M,當我們上傳大于2M的文件時,就會出現上面的異常。是這個異常的發生導致了fileUpload攔截器沒有機會執行,所以我看到的是頁面沒有任何變化,也沒有任何提示信息,只是在控制臺打印出了上面的異常。解決的辦法在struts.properties文件中把struts.multipart.maxSize設置成一個比較大的值,也是就說maxSize遠遠要大于可能上傳文件的大小和fileUpload攔截器中maxinumSize的值,可參見上面的struts.xmlstruts.properties文件。

    Feedback

    # re: Struts2中使用Common-FileUpload實現文件上傳  回復  更多評論   

    2008-02-17 12:17 by dmxzl
    思路不錯呀……

    # re: Struts2中使用Common-FileUpload實現文件上傳  回復  更多評論   

    2008-02-20 15:16 by wangjian
    很好的一篇文章

    # re: Struts2中使用Common-FileUpload實現文件上傳  回復  更多評論   

    2008-06-27 11:25 by 孤獨浪子
    不錯,學習了

    # re: Struts2中使用Common-FileUpload實現文件上傳  回復  更多評論   

    2008-07-28 10:19 by Jaychen
    jpg的 圖片是可以上傳的。。。image/pjpeg從錯誤頁面可以得出結論

    # re: Struts2中使用Common-FileUpload實現文件上傳  回復  更多評論   

    2008-09-16 16:19 by 按時打發士大夫
    getUploadFileName() 一直為空啊???????

    # re: Struts2中使用Common-FileUpload實現文件上傳  回復  更多評論   

    2008-09-16 16:40 by 按時打發士大夫
    好了

    # re: Struts2中使用Common-FileUpload實現文件上傳  回復  更多評論   

    2008-11-06 11:54 by 得到
    不太好,還是要把文件上傳完畢了,再判斷大小。
    最好能在action 之前就提示錯誤

    # re: Struts2中使用Common-FileUpload實現文件上傳[未登錄]  回復  更多評論   

    2009-03-10 13:28 by jack
    還是沒解決空文件提交的問題

    # re: Struts2中使用Common-FileUpload實現文件上傳  回復  更多評論   

    2009-09-07 14:33 by 傅紅雪

    posts - 146, comments - 143, trackbacks - 0, articles - 0

    Copyright © flustar

    主站蜘蛛池模板: 一级做a爰片久久免费| 国产在线观看免费完整版中文版 | 亚洲一区免费视频| 日本亚洲欧洲免费天堂午夜看片女人员| 免费精品国自产拍在线播放 | 国产成人免费一区二区三区| 亚洲一区无码中文字幕乱码| 99久久免费看国产精品| 久久国产亚洲观看| 免费人成激情视频在线观看冫| 国产亚洲精品自在线观看| 免费无码国产V片在线观看| 国产一区二区三区在线观看免费| 亚洲乱码av中文一区二区| 一二三四在线播放免费观看中文版视频 | 久久午夜夜伦鲁鲁片无码免费| 亚洲午夜AV无码专区在线播放| 日韩国产精品亚洲а∨天堂免| 天天摸天天碰成人免费视频| 日韩亚洲产在线观看| 97在线观免费视频观看| 亚洲一区二区三区在线观看蜜桃 | 免费国产综合视频在线看| 色天使色婷婷在线影院亚洲| 国产黄色片在线免费观看| 精品亚洲成a人在线观看| 国产高清视频在线免费观看| mm1313亚洲国产精品无码试看| 女人18毛片a级毛片免费视频| 亚洲综合精品成人| 日韩视频在线免费观看| 亚洲AV无码一区二区三区久久精品| 韩国免费三片在线视频| 亚洲AV无码成人精品区狼人影院| 国产网站免费观看| 黄网站色视频免费看无下截| 亚洲一级特黄无码片| 成人精品视频99在线观看免费| 国产AV无码专区亚洲Av| 日韩免费视频一区二区| 自怕偷自怕亚洲精品|