JSP文件下載類整理完成??梢栽贘SP頁面中實現(xiàn)簡單的下載,,支持文件打包下載功能。支持將字符串或者流生成文件提供下載的功能,。但是也有一些缺點?,F(xiàn)把這個類的基本介紹總結(jié)如下,。
名稱:jsp頁面下載類 作者:SinNeR Mail:vogoals[at]hotmail.com
特點及功能介紹:
- 支持單文件下載。支持多文件zip壓縮下載,。多文件zip壓縮可在服務(wù)器保留或者刪除副本,。支持將特定的字符串或者byte數(shù)組以指定的文件名提供下載,。
- 在下載過程中需要提供response對象,。并且選擇下載形式。
- 下載處理前先進行check,,避免出現(xiàn)錯誤,。
- 下載處理過程中出錯時,,會報告錯誤信息。
- 日文系統(tǒng)下文件名是中文時出現(xiàn)亂碼問題,。
- 處理前需要進行相對繁瑣的設(shè)定,。
現(xiàn)介紹下使用者可見的方法的功能。
設(shè)定實現(xiàn)下載必須的response對象,。 public void setResponse(HttpServletResponse
response)
設(shè)定下載方式:0 為普通單文件下載,。 1 為多文件壓縮成zip包下載。 2 為將指定的字符串等拼接成文件內(nèi)容提供給用戶下載,。 public void
setDownType(int fileType)
設(shè)定下載時顯示給用的文件名,。 public void setDisFileName(String fileName)
壓縮文件下載時,設(shè)定壓縮文件暫時保存的路徑(路徑為絕對路徑) public void setZipFilePath( String path
)
壓縮文件下載時,,設(shè)定服務(wù)器端生成的壓縮文件是否刪除,。True 刪除;false 保留,。 public void
setZipDelFlag(boolean b) 壓縮文件下載時,,設(shè)定要壓縮的文件的文件路徑(路徑為絕對路徑) public
void setZipFileNames(String[] fileNames)
單文件下載時,設(shè)定下載文件的路徑(絕對路徑) public void setDownFileName(String fileName)
將字符串生成文件內(nèi)容模擬下載時,,設(shè)定文件的內(nèi)容,。參數(shù)為字符串(可多次調(diào)用) public int setFileContent(String
fileContent)
將字符串生成文件內(nèi)容模擬下載時,設(shè)定文件的內(nèi)容,。參數(shù)為byte數(shù)組(可多次調(diào)用) 返回值:0 操作正常,; 9 出現(xiàn)IO異常。 public
int setFileContent(byte[] fileContent)
將字符串生成文件內(nèi)容模擬下載時,,調(diào)用此方法結(jié)束文件內(nèi)容設(shè)定,。 返回值:0 操作正常; 9 出現(xiàn)IO異常,。 public int
setFileContentEnd() 主處理函數(shù),。 返回值: 0 處理正常,;1 未設(shè)定response對象。 2
未設(shè)定文件下載方式,。 3 未設(shè)定要顯示的文件名,。 4 未設(shè)定要下載的文件路徑,或者設(shè)定的下載的文件路徑不存在,。 9 IO異常,。 public
int process()
現(xiàn)在介紹不同下載模式下的簡單流程:
單文件下載流程:
//實例初始化 JspFileDownload jfd = new
JspFileDownload(); //設(shè)定response對象
jfd.setResponse(response); //設(shè)定文件下載模式 0
單文件下載。 jfd.setDownType(0); //設(shè)定顯示的文件名
xxxx.xxx jfd.setDisFileName(filename); //設(shè)定要下載的文件的路徑,,絕對路徑 jfd.setDownFileName(filePath); //主處理函數(shù),。注意處理返回值。 int
result = jfd.process();
多文件壓縮成ZIP文件下載:
//實例初始化 JspFileDownload jfd = new
JspFileDownload(); //設(shè)定response對象,。 jfd.setResponse(response); //設(shè)定下載模式
1
多文件壓縮成ZIP文件下載,。 jfd.setDownType(1); //設(shè)定顯示的文件名 jfd.setDisFileName(filename); //設(shè)定要下載的文件的路徑(數(shù)組,絕對路徑) jfd.setZipFileNames(fileNames); //設(shè)定服務(wù)器端生成的zip文件是否保留,。
true 刪除 false 保留,,默認為false jfd.setZipDelFlag(true); //設(shè)定zip文件暫時保存的路徑
(是文件夾) jfd.setZipFilePath(zipfolder); //主處理函數(shù) 注意返回值 Int result =
jfd.process();
將字符串生成為文件內(nèi)容,模擬文件下載:
//實例初始化 JspFileDownload jfd = new
JspFileDownload(); //設(shè)定response對象,。 jfd.setResponse(response); //設(shè)定下載模式
2
將字符串作為文件內(nèi)容,,實現(xiàn)文件下載。 jfd.setDownType(2); //設(shè)定文件顯示的名稱,。 jfd.setDisFileName(request.getParameter("filename")); //主處理函數(shù),,下載前check,注意返回值 out.print(jfd.process()); //設(shè)定要寫入文件的內(nèi)容,,參數(shù)可為字符串或者byte數(shù)組,。可多次調(diào)用,。 jfd.setFileContent(request.getParameter("name")); //文件內(nèi)容設(shè)定完了,,調(diào)用函數(shù)。
jfd.setFileContentEnd();
以上就是簡單的使用介紹,。下面貼出主處理類的代碼,。由于在日文系統(tǒng)下編輯的文件。注釋只能寫英文,,英文太差-_-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@ * by
vogoal.com * mail: [email protected] */ /** * 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"%>
注意: 可能存在編碼方式的問題,,如果出現(xiàn)或者有別的bug請聯(lián)系我,我來debug,。
附件為這個類的source以及測試程序,。
附件說明:
- 單文件下載測試程序
請求頁面:downloadSimpleFile.html 下載功能實現(xiàn)頁面:downloadSimpleFile.jsp
- 多文件壓縮成zip文件下載的測試程序
請求頁面:downloadZipFile.html 下載功能實現(xiàn)頁面:downloadZipFile.jsp
- 字符串生成文件內(nèi)容模擬文件下載的測試程序。
請求頁面:downloadStreamFile.html 下載功能實現(xiàn)頁面:downloadStreamFile.jsp
- Source及class文件,。
Source WEB-INF/src/com/vogoal/util/
JspFileDownload.java Class文件WEB-INF/classes/com/vogoal/util/
JspFileDownload.class
下載:jspDownloadClass.zip
以上文件為SinNeR勞動成果,,歸blueidea所有,轉(zhuǎn)載請注明出處,。
經(jīng)典論壇討論: http://bbs./thread-2732283-1-1.html 本文鏈接:http://www./tech/program/2008/5258.asp
出處:藍色理想 |