JSP 多个文件打包下载代码

  现把该程序主要代码贴下,供大家需要的时候参考下:

  <%@page import="java.util.*,

  java.net.*,

  java.text.*,

  java.util.zip.*,

  java.io.*" %>

  <%!

  static Vector expandFileList(String[] files, boolean inclDirs){

  Vector v = new Vector();

  if (files == null) return v;

  for (int j=0; j < files.length; i++) v.add (new File(URLDecoder.decode(files[j])));

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

  File f = (File) v.get(i);

  if (f.isDirectory()){

  File[] fs = f.listFiles();

  for (int n = 0; n < fs.length; n++) v.add(fs[n]);

  if (!inclDirs){

  v.remove(i);

  i--;

  }

  }

  }

  return v;

  }

  class Writer2Stream extends OutputStream{

  Writer out;

  Writer2Stream (Writer w){

  super();

  out = w;

  }

  public void write(int i) throws IOException{

  out.write(i);

  }

  public void write(byte[] b) throws IOException{

  for (int j=0;j<b.length;j++){

  int n=b[j];

  //Convert byte to ubyte

  n=((n>>>4)&0xF)*16+(n&0xF);

  out.write (n);

  }

  }

  public void write(byte[] b, int off, int len) throws IOException{

  for (int j = off; j < off + len; j++){

  int n=b[j];

  n = ((n>>>4)&0xF)*16+(n&0xF);

  out.write(n);

  }

  }

  } 

  %>

  <%

  /////下载压缩文件包

  Vector v = expandFileList(request.getParameterValues("selfile"), false);

  if (v.size() == 0){

  request.setAttribute("error", "No files selected");

  }

  else{

  File dir_file = new File(request.getRealPath("") + "/myfile/");

  int dir_l = dir_file.getAbsolutePath().length();

  response.setContentType ("application/zip");

  response.setHeader ("Content-Disposition", "attachment;filename=\"downloadname.rar\"");

  out.clearBuffer();

  ZipOutputStream zipout = new ZipOutputStream(new Writer2Stream(out));

  zipout.setComment("Download selected files \nas one WinRAR file:\ndownloadname.rar");

  zipout.setLevel(1);

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

  File f = (File)v.get(i);

  if (f.canRead()){

  zipout.putNextEntry(new ZipEntry(f.getAbsolutePath().substring(dir_l+1)));

  BufferedInputStream fr = new BufferedInputStream(new FileInputStream(f));

  byte buffer[] = new byte[0xffff];

  int b;

  while ((b=fr.read())!=-1) zipout.write(b);

  fr.close();

  zipout.closeEntry();

  }

  }

  zipout.finish();

  out.flush();

  }

  %>