Jsp页面实现文件上传下载类代码

  刚才和lp看完电影,把jsp页面抽出class调整了一下。最近总上经典,是感觉既然当了斑竹,就该留下点什么。lp这几天也半开玩笑半生气的说,一回来就上经典,就发帖,你干脆娶经典作lp得了。想想,这几天是有点夸张,以后放慢速度了。保持1星期1帖吧,那样也能多想写,多总结些。

  发帖的初衷就是有时候看到有的朋友问的问题,似乎还没有走进java的门,希望这样的帖子,能对新手一点帮助,也就满足了。有时候随意的一段话,其实也是自己的一点经验,而有时候之所以絮絮叨叨,是想把问题说的清楚明白,让高手见笑了。因为在入门的时候,每一个小环节都可能郁闷半天,如果看到我的某段话,有所帮助的话,即使我说十句有一句有帮助,我也满足了。因为我在不停的说话。

  现在把总结的jsp页面上传类发布出来。代码肯定还会存在问题,有bug的话,告诉我,我及时修正。

  名称:jsp页面上传类

  作者:SinNeR

  Mail:vogoals[at]hotmail.com

  特点

  1. 可以多文件上传;
  2. 返回上传后的文件名;
  3. form表单中的其他参数也可以得到。

  先贴上传类,JspFileUpload

  package com.vogoal.util;

  import java.io.BufferedOutputStream;

  import java.io.File;

  import java.io.FileOutputStream;

  import java.io.IOException;

  import java.text.SimpleDateFormat;

  import java.util.ArrayList;

  import java.util.Date;

  import java.util.Hashtable;

  import javax.servlet.ServletInputStream;

  import javax.servlet.http.HttpServletRequest;

  /*

  * vogoalAPI 1.0

  * Auther [email protected]

  * by vogoal.com

  * mail: [email protected]

  */

  /**

  * JSP上传文件类

  *

  * @author SinNeR

  * @version 1.0

  */

  public class JspFileUpload {

  /** request对象 */

  private HttpServletRequest request = null;

  /** 上传文件的路径 */

  private String uploadPath = null;

  /** 每次读取得字节的大小 */

  private static int BUFSIZE = 1024 * 8;

  /** 存储参数的Hashtable */

  private Hashtable paramHt = new Hasptable();

  /** 存储上传的文件的文件名的ArrayList */

  private ArrayList updFileArr = new ArrayList();

  /**

  * 设定request对象。

  *

  * @param request

  *            HttpServletRequest request对象

  */

  public void setRequest(HttpServletRequest request) {

  this.request = request;

  }

  /**

  * 设定文件上传路径。

  *

  * @param path

  *            用户指定的文件的上传路径。

  */

  public void setUploadPath(String path) {

  this.uploadPath = path;

  }

  /**

  * 文件上传处理主程序。�������B

  *

  * @return int 操作结果 0 文件操作成功;1 request对象不存在。 2 没有设定文件保存路径或者文件保存路径不正确;3

  *         没有设定正确的enctype;4 文件操作异常。

  */

  public int process() {

  int status = 0;

  // 文件上传前,对request对象,上传路径以及enctype进行check。

  status = preCheck();

  // 出错的时候返回错误代码。

  if (status != 0)

  return status;

  try {

  // ��参数或者文件名�u��

  String name = null;

  // 参数的value

  String value = null;

  // 读取的流是否为文件的标志位

  boolean fileFlag = false;

  // 要存储的文件。

  File tmpFile = null;

  // 上传的文件的名字

  String fName = null;

  FileOutputStream baos = null;

  BufferedOutputStream bos = null;

  // ��存储参数的Hashtable

  paramHt = new Hashtable();

  updFileArr = new ArrayList();

  int rtnPos = 0;

  byte[] buffs = new byte[BUFSIZE * 8];

  // �取得ContentType

  String contentType = request.getContentType();

  int index = contentType.indexOf("boundary=");

  String boundary = "--" + contentType.substring(index + 9);

  String endBoundary = boundary + "--";

  // �从request对象中取得流。

  ServletInputStream sis = request.getInputStream();

  // 读取1行

  while ((rtnPos = sis.readLine(buffs, 0, buffs.length)) != -1) {

  String strBuff = new String(buffs, 0, rtnPos);

  // 读取1行数据�n��

  if (strBuff.startsWith(boundary)) {

  if (name != null && name.trim().length() > 0) {

  if (fileFlag) {

  bos.flush();

  baos.close();

  bos.close();

  baos = null;

  bos = null;

  updFileArr.add(fName);

  } else {

  Object obj = paramHt.get(name);

  ArrayList al = new ArrayList();

  if (obj != null) {

  al = (ArrayList) obj;

  }

  al.add(value);

  System.out.println(value);

  paramHt.put(name, al);

  }

  }

  name = new String();

  value = new String();

  fileFlag = false;

  fName = new String();

  rtnPos = sis.readLine(buffs, 0, buffs.length);

  if (rtnPos != -1) {

  strBuff = new String(buffs, 0, rtnPos);

  if (strBuff.toLowerCase().startsWith(

  "content-disposition: form-data; ")) {

  int nIndex = strBuff.toLowerCase().indexOf(

  "name=\"");

  int nLastIndex = strBuff.toLowerCase().indexOf(

  "\"", nIndex + 6);

  name = strBuff.substring(nIndex + 6, nLastIndex);

  }

  int fIndex = strBuff.toLowerCase().indexOf(

  "filename=\"");

  if (fIndex != -1) {

  fileFlag = true;

  int fLastIndex = strBuff.toLowerCase().indexOf(

  "\"", fIndex + 10);

  fName = strBuff.substring(fIndex + 10, fLastIndex);

  fName = getFileName(fName);

  if (fName == null || fName.trim().length() == 0) {

  fileFlag = false;

  sis.readLine(buffs, 0, buffs.length);

  sis.readLine(buffs, 0, buffs.length);

  sis.readLine(buffs, 0, buffs.length);

  continue;

  }else{

  fName = getFileNameByTime(fName);

  sis.readLine(buffs, 0, buffs.length);

  sis.readLine(buffs, 0, buffs.length);

  }

  }

  }

  } else if (strBuff.startsWith(endBoundary)) {

  if (name != null && name.trim().length() > 0) {

  if (fileFlag) {

  bos.flush();

  baos.close();

  bos.close();

  baos = null;

  bos = null;

  updFileArr.add(fName);

  } else {

  Object obj = paramHt.get(name);

  ArrayList al = new ArrayList();

  if (obj != null) {

  al = (ArrayList) obj;

  }

  al.add(value);

  paramHt.put(name, al);

  }

  }

  } else {

  if (fileFlag) {

  if (baos == null && bos == null) {

  tmpFile = new File(uploadPath + fName);

  baos = new FileOutputStream(tmpFile);

  bos = new BufferedOutputStream(baos);

  }

  bos.write(buffs, 0, rtnPos);

  baos.flush();

  } else {

  System.out.println("test :" + value + "--" + strBuff);

  value = value + strBuff;

  }

  }

  }

  } catch (IOException e) {

  status = 4;

  }

  return status;

  }

  private int preCheck() {

  int errCode = 0;

  if ( request == null )

  return 1;

  if ( uploadPath == null || uploadPath.trim().length() == 0 )

  return 2;

  else{

  File tmpF = new File(uploadPath);

  if (!tmpF.exists())

  return 2;

  }

  String contentType = request.getContentType();

  if ( contentType.indexOf("multipart/form-data") == -1 )

  return 3;

  return errCode;

  }

  public String getParameter(String name){

  String value = "";

  if ( name == null || name.trim().length() == 0 )

  return value;

  value = (paramHt.get(name) == null)?"":(String)((ArrayList)paramHt.get(name)).get(0);

  return value;

  }

  public String[] getParameters(String name){

  if ( name == null || name.trim().length() == 0 )

  return null;

  if ( paramHt.get(name) == null )

  return null;

  ArrayList al = (ArrayList)paramHt.get(name);

  String[] strArr = new String[al.size()];

  for ( int i=0;i<al.size();i++ )

  strArr[i] = (String)al.get(i);

  return strArr;

  }

  public int getUpdFileSize(){

  return updFileArr.size();

  }

  public String[] getUpdFileNames(){

  String[] strArr = new String[updFileArr.size()];

  for ( int i=0;i<updFileArr.size();i++ )

  strArr[i] = (String)updFileArr.get(i);

  return strArr;

  }

  private String getFileName(String input){

  int fIndex = input.lastIndexOf("\\");

  if (fIndex == -1) {

  fIndex = input.lastIndexOf("/");

  if (fIndex == -1) {

  return input;

  }

  }

  input = input.substring(fIndex + 1);

  return input;

  }

  private String getFileNameByTime(String input){

  int index = input.indexOf(".");

  Date dt = new Date();

  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");

  return input.substring(0,index) + sdf.format(dt) + input.substring(index);

  }

  }

  说明

  这个类基本解决了上一贴的上一贴说的存在的bug和不足。主要做了如下修正。

  1. 用户可以设定文件上传的路径,这里没有用request对象的getRealPath方法来取得相对路径,而是用了绝对路径。是一个小败笔。因为有时候用户只是得到服务器的一个应用,而不知道整个服务器的路径。但是既然getRealPath自己可以得到,用户自己取得也可以。
  2. 在文件上传处理的时候,预先进行了check,把一些可能出现的造成上传失败的情况拍查掉。避免该类出现不该出现的异常。
  3. 捕获了IO异常,避免文件上传的时候出现异常时程序的不友好表现
  4. 提供了方法返回form表单中其他参数的取得,模拟了HttpServletRequest对象的getParameter和getParameters方法(后面这个方法是叫这个名字么-_-b),取得Parameter的名称的方法没有提供,是个小缺陷。
  5. 提供了方法返回上传的文件的件数和上传的文件名,方便用户作其他操作。

  现在介绍下JSP页面中如何用这个类实现上传。

  首先,要把这个类编译后的class文件拷贝到WEB-INF/classes/目录下。注意保持package的结构。

  在jsp页面中引用这个类

  

  <%@page import="com.vogoal.util.JspFileUpload"%>

  <%

  //初始化

  JspFileUpload jfu = new JspFileUpload();

  //设定request对象

  jfu.setRequest(request);

  //设定上传的文件路径

  jfu.setUploadPath("C:\\");

  //上传处理

  int rtn = jfu.process();

  //取得form中其他input控件参数的值

  String username = jfu.getParameter("username");

  //如果对应同一个参数有多个input控件,返回数组

  String[] usernameArr = jfu.getParameters("username");

  //取得上传的文件的名字

  String[] fileArr = jfu.getUpdFileNames();

  //取得上传文件的个数,这个方法有点鸡肋

  int fileNumber = jfu.getUpdFileSize();

  //下面的是测试输出的代码。

  //       out.println("parameter:" + username);

  //       out.println("parameter size:" + usernameArr.length);

  //       out.println("fileArr size:" + fileArr.length);

  //       if (fileArr.length > 0)

  //              out.println("fileArr 0:" + fileArr[0]);

  %>

  

  使用的时候的注意事项

  1. 一定要设定request对象。
  2. 一定要设定正确的上传路径。
  3. 执行完了之后才可以得到其他参数,因为执行了之后这些参数才被分析。

  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

  特点及功能介绍

  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 [email protected]

  * 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"%>

  注意

  可能存在编码方式的问题,如果出现或者有别的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

  以上文件为SinNeR劳动成果,归blueidea所有,转载请注明出处。