學習 學習 再學習

          學習才是唯一的出路

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            31 隨筆 :: 1 文章 :: 8 評論 :: 0 Trackbacks

          JSP文件下載類整理完成。可以在JSP頁面中實現簡單的下載,支持文件打包下載功能。支持將字符串或者流生成文件提供下載的功能。但是也有一些缺點。現把這個類的基本介紹總結如下。

          名稱:jsp頁面下載類

          特點及功能介紹

          1. 支持單文件下載。支持多文件zip壓縮下載。多文件zip壓縮可在服務器保留或者刪除副本。支持將特定的字符串或者byte數組以指定的文件名提供下載。
          2. 在下載過程中需要提供response對象。并且選擇下載形式。
          3. 下載處理前先進行check,避免出現錯誤。
          4. 下載處理過程中出錯時,會報告錯誤信息。
          5. 日文系統下文件名是中文時出現亂碼問題。
          6. 處理前需要進行相對繁瑣的設定。

          現介紹下使用者可見的方法的功能。

          設定實現下載必須的response對象。
          public void setResponse(HttpServletResponse response)

          設定下載方式:0 為普通單文件下載。 1 為多文件壓縮成zip包下載。 2 為將指定的字符串等拼接成文件內容提供給用戶下載。
          public void setDownType(int fileType)

          設定下載時顯示給用的文件名。
          public void setDisFileName(String fileName)
             

          壓縮文件下載時,設定壓縮文件暫時保存的路徑(路徑為絕對路徑)
          public void setZipFilePath( String path )
             

          壓縮文件下載時,設定服務器端生成的壓縮文件是否刪除。True 刪除;false 保留。
          public void setZipDelFlag(boolean b)
             
          壓縮文件下載時,設定要壓縮的文件的文件路徑(路徑為絕對路徑)
          public void setZipFileNames(String[] fileNames)

          單文件下載時,設定下載文件的路徑(絕對路徑)
          public void setDownFileName(String fileName)
             

          將字符串生成文件內容模擬下載時,設定文件的內容。參數為字符串(可多次調用)
          public int setFileContent(String fileContent)

          將字符串生成文件內容模擬下載時,設定文件的內容。參數為byte數組(可多次調用)
          返回值:0 操作正常; 9 出現IO異常。
          public int setFileContent(byte[] fileContent)
             
          將字符串生成文件內容模擬下載時,調用此方法結束文件內容設定。
          返回值:0 操作正常; 9 出現IO異常。
          public int setFileContentEnd()
             
          主處理函數。
          返回值:    0   處理正常;1  未設定response對象。 2  未設定文件下載方式。  3   未設定要顯示的文件名。  4  未設定要下載的文件路徑,或者設定的下載的文件路徑不存在。  9  IO異常。
          public int process()

          現在介紹不同下載模式下的簡單流程:

          單文件下載流程

          //實例初始化
          JspFileDownload jfd = new JspFileDownload();
          //設定response對象   
          jfd.setResponse(response);
          //設定文件下載模式 0 單文件下載。
          jfd.setDownType(0);
          //設定顯示的文件名 xxxx.xxx
          jfd.setDisFileName(filename);
          //設定要下載的文件的路徑,絕對路徑
          jfd.setDownFileName(filePath);
          //主處理函數。注意處理返回值。
          int result = jfd.process();

          多文件壓縮成ZIP文件下載

          //實例初始化
          JspFileDownload jfd = new JspFileDownload();
          //設定response對象。
          jfd.setResponse(response);
          //設定下載模式 1 多文件壓縮成ZIP文件下載。
          jfd.setDownType(1);
          //設定顯示的文件名
          jfd.setDisFileName(filename);
          //設定要下載的文件的路徑(數組,絕對路徑)
          jfd.setZipFileNames(fileNames);
          //設定服務器端生成的zip文件是否保留。 true 刪除  false 保留,默認為false
          jfd.setZipDelFlag(true);
          //設定zip文件暫時保存的路徑 (是文件夾)
          jfd.setZipFilePath(zipfolder);
          //主處理函數 注意返回值
          Int result = jfd.process();

          將字符串生成為文件內容,模擬文件下載

          //實例初始化
          JspFileDownload jfd = new JspFileDownload();
          //設定response對象。
          jfd.setResponse(response);
          //設定下載模式 2 將字符串作為文件內容,實現文件下載。
          jfd.setDownType(2);
          //設定文件顯示的名稱。
          jfd.setDisFileName(request.getParameter("filename"));
          //主處理函數,下載前check,注意返回值
          out.print(jfd.process());
          //設定要寫入文件的內容,參數可為字符串或者byte數組。可多次調用。
          jfd.setFileContent(request.getParameter("name"));
          //文件內容設定完了,調用函數。   
          jfd.setFileContentEnd();

          以上就是簡單的使用介紹。下面貼出主處理類的代碼。由于在日文系統下編輯的文件。注釋只能寫英文,英文太差-_-b。多包涵。

          package com.vogoal.util;
          import java.io.BufferedInputStream;
          import java.io.File;
          import java.io.FileInputStream;
          import java.io.FileOutputStream;
          import java.io.IOException;
          import java.io.InputStream;
          import java.util.zip.ZipEntry;
          import java.util.zip.ZipOutputStream;
          import javax.servlet.http.HttpServletResponse;
          /*
          * vogoalAPI 1.0
          * Auther SinNeR@blueidea.com
          * by vogoal.com
          * mail: vogoals@hotmail.com
          */
          /**
          * JSP FILE DOWNLOAD SUPPORT
          *
          * @author SinNeR
          * @version 1.0
          */
          public class JspFileDownload {
              /** request object */
              private HttpServletResponse response = null;
              /** file type: -1 un-setting; 0 normal file; 1 zip file ;2 stream*/
              private int fileType = -1;
             
              /** file name to be displayed */
              private String disFileName = null;
             
              /** zip file path */
              private String zipFilePath = null;
             
              /** file to be zipped */
              private String[] zipFileNames = null;
             
              private boolean zipDelFlag = false;
             
              /** file to be downloaded */
              private String downFileName = null;
             
              /** error code 0 */
              private static final int PROCESS_OK = 0;
             
              /** error code 1 */
              private static final int RESPONSE_IS_NULL = 1;
             
              /** error code 2 */
              private static final int UNSET_DOWNLOADTYPE = 2;
             
              /** error code 3 */
              private static final int UNSET_DIS_FILE_NAME = 3;
             
              /** error code 4 */
              private static final int UNSET_DOWN_FILE_NAME = 4;
             
              /** error code 9 */
              private static final int IO_EXCEPTION = 9;
             
              /**
               * set response object
               * @param response response Object
               */
              public void setResponse(HttpServletResponse response){
                  this.response = response;
              }
             
              /**
               * set file type 0 normal file; 1 zip file ;2 stream
               * @param fileType
               */
              public void setDownType(int fileType){
                  this.fileType = fileType;
              }
             
              /**
               * set display file name
               * @param fileName
               */
              public void setDisFileName(String fileName){
                  this.disFileName = fileName;
              }
             
              /**
               * set zip file path
               * @param fileNames
               */
              public void setZipFilePath( String path ){
                  this.zipFilePath = path;
              }
             
              public void setZipDelFlag(boolean b){
                  this.zipDelFlag = b;
              }
             
              /**
               * set zip file names
               * @param fileNames
               */
              public void setZipFileNames(String[] fileNames){
                  this.zipFileNames = fileNames;
              }
             
              /**
               * set download file name
               * @param fileName
               */
              public void setDownFileName(String fileName){
                  this.downFileName = fileName;
              }
             
              /**
               * set file content
               * @param fileContent
               */
              public int setFileContent(String fileContent){   
                  try{   
                      byte[] buffs = fileContent.getBytes("UTF-8");
                      response.getOutputStream().write(buffs);
                  }catch(IOException e){
                      return IO_EXCEPTION;
                  }
                  return PROCESS_OK;
              }
             
              /**
               * set file content
               * @param fileContent
               */
              public int setFileContent(byte[] fileContent){
                  try{
                      response.getOutputStream().write(fileContent);
                  }catch(IOException e){
                      return IO_EXCEPTION;
                  }
                  return PROCESS_OK;
              }
             
              /**
               * set file content end
               *
               */
              public int setFileContentEnd(){
                  try{
                      response.getOutputStream().close();
                  }catch(IOException e){
                      return IO_EXCEPTION;
                  }
                  return PROCESS_OK;
              }
             
              /**
               * main process
               * @return
               */
              public int process(){
                  int status = PROCESS_OK;
                 
                  status = preCheck();
                  if ( status != PROCESS_OK )
                      return status;
                     
                  String fileName = disFileName;
                 
                  response.setContentType("APPLICATION/OCTET-STREAM");  
                  response.setHeader("Content-Disposition","attachment;filename=\"" + fileName + "\"");
                  int BUFSIZE = 1024 * 8;       
                  int rtnPos = 0;
                  byte[] buffs = new byte[ BUFSIZE ];
                  FileInputStream inStream = null;
                  ZipOutputStream zos = null;
                  InputStream is = null;
                  String filepath = null;
                  try{
                   
                      if ( fileType == 0 || fileType == 1){
                          if ( fileType == 0 ){
                              filepath = downFileName;  
                          }else{
                              filepath = zipFilePath + fileName;
                              String[] fileToZip = zipFileNames;
                                             
                              zos=new ZipOutputStream(new FileOutputStream(filepath));
                              ZipEntry ze=null;
                              byte[] buf=new byte[BUFSIZE];
                              int readLen=0;
                              for (int i= 0;i<fileToZip.length;i++){
                                  File f= new File(fileToZip[i]);
                 
                                  ze=new ZipEntry(f.getName());
                                  ze.setSize(f.length());
                                  ze.setTime(f.lastModified());
                 
                                  zos.putNextEntry(ze);
                                  is=new BufferedInputStream(new FileInputStream(f));
                                  while ((readLen=is.read(buf, 0, BUFSIZE))!=-1) {
                                      zos.write(buf, 0, readLen);
                                  }
                                  is.close();
                              }
                              zos.close();
                          }
                    
                          inStream =new FileInputStream(filepath);  
            
                          while((rtnPos=inStream.read(buffs)) >0)  
                              response.getOutputStream().write(buffs,0,rtnPos);  
                          response.getOutputStream().close();  
                          inStream.close();
                      }
                      if ( zipDelFlag ){
                          File fToDel = new File(filepath);
                          fToDel.delete();
                      }
                  }catch(IOException e){
                      return IO_EXCEPTION;
                  }finally{
                      try{
                          if ( inStream != null ){
                              inStream.close();
                              inStream = null;
                          }
                          if ( zos != null ){
                              zos.close();
                              zos = null;
                          }
                          if ( is != null ){
                              is.close();
                              is = null;
                          }
                      }catch (IOException e){
                      }
                  }
                  return status;
              }
             
              /**
               * pre check.
               * @return
               */
              private int preCheck(){
                 
                  if ( response == null )
                      return RESPONSE_IS_NULL;
                     
                  if ( disFileName == null || disFileName.trim().length() == 0 )
                      return UNSET_DIS_FILE_NAME;
                  if ( fileType == -1 )
                      return UNSET_DOWNLOADTYPE;
                  else if ( fileType == 0 ){
                      if ( downFileName == null || downFileName.trim().length() == 0 )
                          return UNSET_DOWN_FILE_NAME;
                      else{
                          if ( !isFile( downFileName ) )
                              return UNSET_DOWN_FILE_NAME;
                      }
                     
                  }else if ( fileType == 1 ){
                      if ( zipFilePath == null || zipFilePath.length() == 0 )
                          return UNSET_DOWN_FILE_NAME;
                      else{
                          if ( !isDirect(zipFilePath) )
                              return UNSET_DOWN_FILE_NAME;
                      }
                      if ( zipFileNames == null || zipFileNames.length == 0 )
                          return UNSET_DOWN_FILE_NAME;
                      else{
                          for ( int i=0;i<zipFileNames.length;i++ ){
                              if ( zipFileNames[i] == null || zipFileNames[i].trim().length() == 0 )
                                  return UNSET_DOWN_FILE_NAME;
                              else{
                                  if ( !isFile( zipFileNames[i] ) )
                                      return UNSET_DOWN_FILE_NAME;
                              }
                          }
                      }
                  }else if ( fileType == 2 ){
                      //doing nothing
                  }else{
                      return UNSET_DOWNLOADTYPE;
                  }
                  return PROCESS_OK;
              }
             
              private boolean isFile(String fileName){
                  File f = new File(fileName);
                  if (!f.exists() || !f.isFile())
                      return false;
                  return true;
              }
             
              private boolean isDirect(String filePath){
                  File f = new File(filePath);
                  if (!f.exists() || !f.isDirectory())
                      return false;
                  return true;
              }
          }

          至此,jsp頁面文件下載介紹完成。
          使用的時候,把這個類生成的class文件拷貝到WEB-INF/classes下。(注意保持包的路徑)

          然后在使用的頁面import進這個class即可。
          <%@ page contentType="text/html;charset=GBK"%>

          注意
          可能存在編碼方式的問題,如果出現或者有別的bug請聯系我,我來debug。

          附件為這個類的source以及測試程序。

          附件說明

          1. 單文件下載測試程序
            請求頁面:downloadSimpleFile.html 
            下載功能實現頁面:downloadSimpleFile.jsp
          2. 多文件壓縮成zip文件下載的測試程序
            請求頁面:downloadZipFile.html 
            下載功能實現頁面:downloadZipFile.jsp
          3. 字符串生成文件內容模擬文件下載的測試程序。
            請求頁面:downloadStreamFile.html
            下載功能實現頁面:downloadStreamFile.jsp
          4. Source及class文件。
            Source WEB-INF/src/com/vogoal/util/ JspFileDownload.java
            Class文件WEB-INF/classes/com/vogoal/util/ JspFileDownload.class

          下載:jspDownloadClass.zip



          J-CN工作室
          www.j-cn.org
          posted on 2009-09-22 08:34 鐵猴 閱讀(778) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 沧州市| 遂昌县| 苍梧县| 铅山县| 汤原县| 韶关市| 大连市| 灯塔市| 万全县| 平罗县| 喀什市| 武宣县| 台山市| 遂川县| 西丰县| 铜川市| 岳阳市| 乌兰浩特市| 北票市| 会同县| 石台县| 奎屯市| 忻州市| 建瓯市| 阿勒泰市| 颍上县| 隆子县| 三门县| 湟源县| 汽车| 磴口县| 南陵县| 禹州市| 四会市| 大冶市| 罗源县| 乌拉特中旗| 赣州市| 清苑县| 聂荣县| 汉寿县|