eArr.length); // out.println("fileArr size:" + fileArr.length); // if (fileArr.length > 0) // out.println("fileArr 0:" + fileArr[0]); %>
使用的时候的注意事项:
- 一定要设定request对象。
- 一定要设定正确的上传路径。
- 执行完了之后才可以得到其他参数,因为执行了之后这些参数才被分析。
1,2两点如果没有做到的话,process方法执行的时候汇报错。
各个用户可用的方法及说明:
设定requet对象。 public void setRequest(HttpServletRequest request)
设定文件上传的路径。 public void setUploadPath(String path)
文件上传处理主程序。 @return int 操作结果 0 文件操作成功;1 request对象不存在。 2 没有设定文件保存路径或者文件保存路径不正确;3 没有设定正确的enctype;4 文件操作异常。 public int process()
根据name取得form表单中其他传递的参数的值(多个的话返回其中一个) public String getParameter(String name)
根据name取得form表单中其他传递的参数的值(返回数组,可有多个) public String[] getParameters(String name)
取得上传成功文件的个数 public int getUpdFileSize()
取得上传的文件名对应的数组。 public String[] getUpdFileNames()
注意process方法地返回值,在不是0的情况下操作失败。
以下提供测试类以及测试页面(见附件):
HelloPostFile.html HelloPostFile.jsp 写在jsp中的代码的测试文件。 HelloPostFileWithClass.html HelloPostFileWithClass.jsp 抽出class后的测试文件。 src在 WEB-INF/src/ class在 WEB-INF/classes/
另: 由于这个文件被我在中文日文系统下编辑过,注释出现乱码,所以大部分都删掉了,见谅。
下载:WEB-INF.zip
JSP文件下载类整理完成。可以在JSP页面中实现简单的下载,支持文件打包下载功能。支持将字符串或者流生成文件提供下载的功能。但是也有一些缺点。现把这个类的基本介绍总结如下。
名称:jsp页面下载类 作者:SinNeR Mail:vogoals[at]hotmail.com
特点及功能介绍:
- 支持单文件下载。支持多文件zip压缩下载。多文件zip压缩可在服务器保留或者删除副本。支持将特定的字符串或者byte数组以指定的文件名提供下载。
- 在下载过程中需要提供response对象。并且选择下载形式。
- 下载处理前先进行check,避免出现错误。
- 下载处理过程中出错时,会报告错误信息。
- 日文系统下文件名是中文时出现乱码问题。
- 处理前需要进行相对繁琐的设定。
现介绍下使用者可见的方法的功能。
设定实现下载必须的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以及测试程序。
附件说明:
- 单文件下载测试程序
请求页面:downloadSimpleFile.html 下载功能实现页面:downloadSimpleFile.jsp
- 多文件压缩成zip文件下载的测试程序
请求页面:downloadZipFile.html 下载功能实现页面:downloadZipFile.jsp
- 字符串生成文件内容模拟文件下载的测试程序。
请求页面:downloadStreamFile.html 下载功能实现页面: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所有,转载请注明出处。 |