文件批量打包下载 框架springmvc

  1. import java.io.BufferedInputStream;  
  2. import java.io.BufferedOutputStream;  
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.io.InputStream;  
  8. import java.io.OutputStream;  
  9. import java.net.URLEncoder;  
  10.   
  11. import javax.servlet.http.HttpServletResponse;  
  12.   
  13. import org.apache.log4j.Logger;  
  14. import org.apache.struts2.ServletActionContext;  
  15. import org.apache.tools.zip.ZipEntry;  
  16. import org.apache.tools.zip.ZipOutputStream;  


/**
  * 导出二维码
  *
  * @param id
  * @param request
  * @param response
  * @param redirectAttributes
  */
 @RequestMapping("exportqrcode")
 public void exportqrcode(@RequestParam(value = "id", required = true) Long id, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
  Meetting meet = meettingService.findById(id);
  List<Contact> c = contactService.findByMeettingId(meet.getId());
  String targetFile = request.getSession().getServletContext().getRealPath("/");
  //图片批量生成
  File[] file1 = null ;
  if (c != null && c.size() > 0) {
   int size = c.size();
   file1=new  File[size];
   for (int i = 0; i < size; i++) {
  String path = targetFile + "export/" + c.get(i).getName()+"_"+c.get(i).getTelephone()+ ".png";
  try {
   CommonTools.createqrImg(path,meet.getCodetype(), c.get(i).getTelephone(),c.get(i).getMcode(), meet.getName(), request);
   file1[i]=new File(path);
  } catch (IOException e) {
   e.printStackTrace();
  }
   }
     }
  
  //批量打包图片为ZIP
  String tmpFileName = meet.getName()+".zip"; 
        byte[] buffer = new byte[1024]; 
        String strZipPath = targetFile + tmpFileName; 
        try { 
            ZipOutputStream out = new ZipOutputStream(new FileOutputStream( 
                    strZipPath)); 
            // 需要同时下载的两个文件result.txt ,source.txt 
            for (int i = 0; i < file1.length; i++) { 
                FileInputStream fis = new FileInputStream(file1[i]); 
                out.putNextEntry(new ZipEntry(file1[i].getName())); 
                //设置压缩文件内的字符编码,不然会变成乱码 
                out.setEncoding("GBK"); 
                int len; 
                // 读入需要下载的文件的内容,打包到zip文件 
                while ((len = fis.read(buffer)) > 0) { 
                    out.write(buffer, 0, len); 
                } 
                out.closeEntry(); 
                fis.close(); 
            } 
            out.close(); 
            this.downFile(response, tmpFileName,strZipPath); 
        } catch (Exception e) { 
         //   Log.error("文件下载出错", e); 
        } 
 }
 
 
  /**
     * 文件下载
     * @param response
     * @param str
     */ 
    private void downFile(HttpServletResponse response, String str,String path) { 
        try { 
            File file = new File(path); 
            if (file.exists()) { 
                InputStream ins = new FileInputStream(path); 
                BufferedInputStream bins = new BufferedInputStream(ins);// 放到缓冲流里面 
                OutputStream outs = response.getOutputStream();// 获取文件输出IO流 
                BufferedOutputStream bouts = new BufferedOutputStream(outs); 
                response.setContentType("application/x-download");// 设置response内容的类型 
                response.setHeader( 
                        "Content-disposition", 
                        "attachment;filename=" 
                                + URLEncoder.encode(str, "UTF-8"));// 设置头部信息 
                int bytesRead = 0; 
                byte[] buffer = new byte[8192]; 
                // 开始向网络传输文件流 
                while ((bytesRead = bins.read(buffer, 0, 8192)) != -1) { 
                    bouts.write(buffer, 0, bytesRead); 
                } 
                bouts.flush();// 这里一定要调用flush()方法 
                ins.close(); 
                bins.close(); 
                outs.close(); 
                bouts.close(); 
            } else { 
               // response.sendRedirect("../error.jsp"); 
            } 
        } catch (IOException e) { 
           // Log.error("文件下载出错", e); 
        } 
    } 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值