JAVA后台多文件打包下载

public void downloadFiles(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
   {
       request.setCharacterEncoding("UTF-8");
       String docId = new String(request.getParameter("docId").getBytes("ISO-8859-1"), "UTF-8");
       String downloadType = new String(request.getParameter("downloadType").getBytes("ISO-8859-1"), "UTF-8");
        
       Document doc = null;
       try
       {
          doc = getFilePath(docId);  //此方法获取文件的路径,这个不显示
      }
      catch (SQLException ex)
      {
         ex.printStackTrace();
      }
   
      List<Element> elements = doc.getRootElement().elements();
      List<File> files = new ArrayList<File>();
      int index = 0;
      long fileLength = 0;
      for(Element ele : elements)
      {
         String filePath = FormatUtil.tryGetItemText(ele, "FILE_PATH", "") + FormatUtil.tryGetItemText(ele, "FILE_NAME", "");
         File file = new File(filePath);
         files.add(file);
         fileLength += file.length();
         index++;
      }
      String fileName = UUID.randomUUID().toString() + ".zip";
      //在服务器端创建打包下载的临时文件
      String outFilePath = "C:\\" + fileName;
      File file = new File(outFilePath);
      //文件输出流
      FileOutputStream outStream = new FileOutputStream(file);
      //压缩流
      ZipOutputStream toClient = new ZipOutputStream(outStream);
      toClient.setEncoding("gbk");
      zipFile(files, toClient);
      toClient.close();
      outStream.close();
      this.downloadZip(file, response);
 }
  /**
   * 压缩文件列表中的文件
   * @param files
   * @param outputStream
   * @throws IOException
   */
  public static void zipFile(List files, ZipOutputStream outputStream) throws IOException,ServletException
  {
      try
      {
         int size = files.size();
         //压缩列表中的文件
         for(int i = 0; i < size; i++)
         {
             File file = (File) files.get(i);
             zipFile(file, outputStream);
          }
       }
       catch(IOException e)
       {
            throw e;
       }
}
  /**
   * 将文件写入到zip文件中
   * @param inputFile
   * @param outputstream
   * @throws Exception
   */
   public static void zipFile(File inputFile, ZipOutputStream outputstream) throws IOException,ServletException
   {
       try{
           if(inputFile.exists())
           {
              if(inputFile.isFile())
              {
                 FileInputStream inStream = new FileInputStream(inputFile);
                 BufferedInputStream bInStream = new BufferedInputStream(inStream);
                 ZipEntry entry = new ZipEntry(inputFile.getName());
                 outputstream.putNextEntry(entry);
                  
                 final int MAX_BYTE = 10 * 1024 *1024;    //最大的流为10M
                 long streamTotal = 0;                      //接受流的容量
                 int streamNum = 0;                      //流需要分开的数量
                 int leaveByte = 0;                      //文件剩下的字符数
                 byte[] inOutbyte;                          //byte数组接受文件的数据
                 
                 streamTotal = bInStream.available();                        //通过available方法取得流的最大字符数
                 streamNum = (int)Math.floor(streamTotal / MAX_BYTE);    //取得流文件需要分开的数量
                 leaveByte = (int)streamTotal % MAX_BYTE;                //分开文件之后,剩余的数量
                 
                 if (streamNum > 0) 
                 {
                     for(int j = 0; j < streamNum; ++j)
                     {
                         inOutbyte = new byte[MAX_BYTE];
                         //读入流,保存在byte数组
                         bInStream.read(inOutbyte, 0, MAX_BYTE);
                         outputstream.write(inOutbyte, 0, MAX_BYTE);  //写出流
                      }
                 }
                 //写出剩下的流数据
                 inOutbyte = new byte[leaveByte];
                 bInStream.read(inOutbyte, 0, leaveByte);
                 outputstream.write(inOutbyte);
                 outputstream.closeEntry();     //Closes the current ZIP entry and positions the stream for writing the next entry
                 bInStream.close();    //关闭
                 inStream.close();
            }
         }
         else
         {
             throw new ServletException("文件不存在!");
         }
     }
     catch(IOException e)
     {
         throw e;
     }
}
  /**
   * 下载打包的文件
   * @param file
   * @param response
   */
  public void downloadZip(File file,HttpServletResponse response) {
      try {
          // 以流的形式下载文件。
          BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file.getPath()));
          byte[] buffer = new byte[fis.available()];
          fis.read(buffer);
          fis.close();
          // 清空response
          response.reset();
  
          OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
          response.setContentType("application/octet-stream");
          response.setHeader("Content-Disposition", "attachment;filename=" + file.getName());
          toClient.write(buffer);
          toClient.flush();
          toClient.close();
          file.delete();        //将生成的服务器端文件删除
       } 
       catch (IOException ex) {
          ex.printStackTrace();
      }
  }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值