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

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

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

    Cyh的博客

    Email:kissyan4916@163.com
    posts - 26, comments - 19, trackbacks - 0, articles - 220

    sturts2的上傳和下載以及中文轉碼問題

    Posted on 2009-05-22 23:06 啥都寫點 閱讀(1085) 評論(1)  編輯  收藏 所屬分類: J2EE
         關于如何在項目中添加struts2這里就不在多說了,struts2上傳下載所需要的jar包大家可以去www.apache.org進行下載,在Jakarta下的選擇
     Commons,然后下載FileUpload 和 IO這兩個jar包。解壓后拷貝到你的項目lib文件夾下就OK了。

         下面直接開始struts2的上傳:

         首先創建一個文件上傳的Action,以下注釋部分為批量上傳時的代碼,大同小異!
        
    public class UploadAction extends ActionSupport {
      
       。。。省略了 getter 和 setter方法
      
       
    private String title;
        
    //單個文件 
        private File upload;
        
        
        
    // 多個文件
        
    // private String[] upload;
        
    //保存上傳文件的文件夾名字,可在配置文件中動態指定
       
        
    private String savePath;
        
        
    private String uploadContentType;
       
        
    private String uploadFileName;

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

        @Override
        
    public String execute() throws Exception {
            System.out.println(
    "進入 execute方法");
            
    //查看上傳文件的大小
            System.out.println("所上傳的文件的大小為"+getUpload().length());
            
            
    //查看上傳文件的名字
            System.out.println("UploadFileName:"+getUploadFileName());
            
            
    //指定上傳文件到哪個文件夾
            FileOutputStream fos = new FileOutputStream(savePath+"\\"
                    
    +getUploadFileName());
            
    //取得一個將要上傳的文件的一個輸入流
            FileInputStream fis = new FileInputStream(getUpload());
            
            
    //當圖片需要存儲進數據庫時,可以將圖片的連接存儲進數據庫,譬如:
            
    //path路徑是需要讀進數據庫滴,所以這里不能使用 getSavePath(),因為這樣返回的是絕對路徑。
            String path = savePath+"\\"+getUploadFileName();
            
            
    byte[] buffer = new byte[1024];
            
            
    int len = 0 ;
            
            
    while((len = fis.read(buffer))>0) {
                fos.write(buffer, 
    0, len);
            }
            System.out.println(
    "文件已上傳");
            
            
    return SUCCESS;
        }

        
    //完成多個文件的上傳
    //    public String execute() throws Exception {
    //
    //        
    //        //查看上傳文件的名字
    //        System.out.println("UploadFileName:"+getUploadFileName());
    //        
    //        //指定上傳文件到哪個文件夾
    //        FileOutputStream fos = new FileOutputStream(savePath+"\\"
    //                +getUploadFileName());
    //        
    //        String[] ss = getUpload();
    //        for(int i=0;i<ss.length;i++){
    //            //取得一個將要上傳的文件的一個輸入流
    //        FileInputStream fis = new FileInputStream(ss[i]);
    //        
    //        //當圖片需要存儲進數據庫時,可以將圖片的連接存儲進數據庫,譬如:
    //        //path路徑是需要讀進數據庫滴
    //        String path = savePath+"\\"+getUploadFileName();
    //        
    //        byte[] buffer = new byte[1024];
    //        
    //        int len = 0 ;
    //        
    //        while((len = fis.read(buffer))>0) {
    //            fos.write(buffer, 0, len);
    //        }    

    //        return SUCCESS ; 
    //    }
      

        
    }

    文件上傳的頁面index.jsp
    <body>
          
    <s:fielderror/>
          
    <s:form action="ryanUpload" enctype="multipart/form-data">
            
    <s:textfield label="title" name="title"/>
                
    <!-- 單個文件上傳 -->
             
    <s:file name="upload" label="文件1"/>     
            
    <!-- 多個文件上傳 
           
            
    <s:file name="upload" label="文件1"/>
            
    <s:file name="upload" label="文件2"/>
            
    <s:file name="upload" label="文件3"/>

          
    -->
          
    <s:submit/>
          
    </s:form>
      
    </body>
    在來看看struts.xml中的配置,
    <struts>
         
    <constant name="struts.i18n.encoding" value="GBK"/>
         
         
    <package name="ryan" extends="struts-default">
         
            
    <action name="ryanUpload" class="com.UploadAction">
                
    <result name="success">/succ.jsp</result>
              
                
    <result name="input">/index.jsp</result>
               
                
    <!-- 動態指定上傳文件的目錄 -->
                 
    <param name="savePath">/upload</param>   <!--  在此處可以動態的指定服務器上存儲圖片的文件夾 --> 
                
                
    <interceptor-ref name="fileUpload">
                   
    <param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param>
                   
    <param name="maximumSize">3000000000</param>  <!--  這里的單位為字節  -->
                
    </interceptor-ref>
                
                
    <interceptor-ref name="defaultStack"/>
            
    </action>
          
             
            
        
    </package>

    </struts>

    struts2下載(參考了beansoft的文章):
       
       
      一般在項目中所用到下載都是直接根據數據庫讀出的地址來進行下載,譬如有下面一個鏈接:
     
       <!-- 假設有這樣一條從數據庫中讀出的數據 ,它的存儲路徑為 downLoad/ryan.jsp ,文件名字為ryan.jsp
                    很明顯這是一張圖片,那么我們點擊下載時就會根據path來進行下載
                                                         
    -->

        <s:url action="downLoad" id="down">
          <s:param name="inputPath">downLoad/ryan.jsp</s:param>
          <s:param name="fileName">ryan.jsp</s:param>
        </s:url>
       
        <s:a href="%{down}">downLoad</s:a>


    來看看我們的struts.xml中的配置

    <struts>
      
    <package  name="technicalInformationAction"   extends="Action">
       
        
    <default-action-ref name="download"/>
     

         
    <action name="downLoad" class="com.DownLoadAction">
                   
                    <!--這里的返回值并不是字符串,而是一個流類型-->  
                    
    <result name="success" type="stream">
                    
                    
    <param name="contentType">application/octet-stream;charset=ISO8859-1</param>
                    
                    
    <param name="inputName">inputStream</param>
                 
           
                     <!--這里需要將文件名進行轉碼,轉碼后將值賦予
    downloadFileName, 對應文中的getDownloadFileName()-->        
                    
    <param name="contentDisposition">attachment;filename="${downloadFileName}"</param> 
                   
                    
    <param name="bufferSize">4096</param>
                    
                    
    </result> 
         
    </action> 
      
      
    </package>
    </struts>

    下載文件的DownLoadAction:

    public class DownLoadAction implements Action{

        
    private String fileName;// 初始的通過param指定的文件名屬性

        
    private String inputPath;// 指定要被下載的文件路徑
        
        String username 
    = "chenyanhu";

        
    public InputStream getInputStream() throws Exception {

        
    // 通過 ServletContext,也就是application 來讀取數據
       
        
    return ServletActionContext.getServletContext().getResourceAsStream("/"+inputPath);

        }
        
         /**
          *   execute中代碼的含義是為了防止他人惡意的下載項目的WEB-INF/web.xml文件,譬如在瀏覽器中輸入
          *  http://......./downLoad.action?inputPath=WEB-INF/web.xml  這樣將下載下的文件后綴名改為xml就可以查看你的項目的web.xml了

          *  execute中代碼的意思是將文件存儲的真實目錄與地址欄的路徑進行對比。
    發現企圖下載不在/download下的文件,就顯示內容為空
          */ 
       

    public
     String execute()
            
            
    // 文件下載目錄路徑

            String downloadDir = ServletActionContext.getServletContext().getRealPath("/technicalInformationDirectory"+"/"+username);

            
    // 文件下載路徑

            String downloadFile 
    = ServletActionContext.getServletContext().getRealPath("/"+inputPath);

            java.io.File file 
    = new java.io.File(downloadFile);
       try{
            downloadFile 
    = file.getCanonicalPath();// 真實文件路徑,去掉里面的..等信息

            
    if(!downloadFile.startsWith(downloadDir)) {

            
    return null;

            }
       }catch (IOException io) {
            // TODO: handle exception
            System.out.println("IO異常!!路徑發生錯誤!");
            io.printStackTrace();
        }catch (SecurityException se) {
            // TODO: handle exception
            System.out.println("安全性異常!!");
            se.printStackTrace();
        }catch (NullPointerException  npe ) {
            System.out.println("空指針異常");
            npe.printStackTrace();
        }catch (Exception e) {
            System.out.println("出現異常了!");
            e.printStackTrace();
        }
            
    return SUCCESS;     
            

        }



        
    // 提供轉換編碼后的供下載用的文件名 

        
    public String getDownloadFileName() {

        String downFileName 
    = fileName;

        
    try {

        downFileName 
    = new String(downFileName.getBytes(), "ISO8859-1");

        } 
    catch (UnsupportedEncodingException e) {

        e.printStackTrace();

        }

        
    return downFileName;

        }
      


        }
       


    關于中文轉碼的問題:
        
          我在項目中遇到了一個問題,那就是下載文件的時候,不能對含有中文名字的文件進行下載,老是出現亂碼,但是數據庫中
      
        是沒有亂碼的,今天花了比較長的時間去解決這個問題,不過現在我已經把這個問題解決, 就是需要修改tomcat的server.xml文件  :
     
                  <Connector port="8641" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" URIEncoding="utf-8"/>
      
        加上紅色部分就OK了!!




                                                                                                           --    學海無涯
            

    Feedback

    # re: sturts2的上傳和下載以及中文轉碼問題  回復  更多評論   

    2009-09-05 09:21 by aasd
    sdf
    主站蜘蛛池模板: 国产国拍亚洲精品福利 | 亚洲综合精品香蕉久久网| 亚洲国产熟亚洲女视频| 亚洲精品动漫免费二区| 日本成人在线免费观看| 亚洲一级免费毛片| 欧洲乱码伦视频免费国产 | 97se亚洲国产综合自在线| 人妻巨大乳hd免费看| 91手机看片国产永久免费| 亚洲欧洲日韩在线电影| 人妻在线日韩免费视频| 无码乱人伦一区二区亚洲一 | 亚洲天堂免费在线视频| 久久久久亚洲AV综合波多野结衣| 亚洲精品视频免费观看| 亚洲精品成人无码中文毛片不卡| 免费观看在线禁片| 亚洲精品午夜在线观看| av永久免费网站在线观看| 亚洲国产老鸭窝一区二区三区| 91精品手机国产免费| 黑人精品videos亚洲人| 99爱免费观看视频在线| 国产精品高清视亚洲一区二区| 国产精品酒店视频免费看| 91视频免费观看| 亚洲精品99久久久久中文字幕 | 亚洲AV无码成人专区片在线观看| 曰批视频免费40分钟试看天天 | 久久久亚洲精品无码| 无码国产精品一区二区免费式直播 | 亚洲一级免费毛片| 免费少妇a级毛片| 亚洲欧美国产国产一区二区三区 | 午夜电影免费观看| 久久er国产精品免费观看8| 全部免费毛片免费播放| 男的把j放进女人下面视频免费| 亚洲色成人网站WWW永久| 日韩中文字幕精品免费一区|