• java 多文件合并成zip并下载


    
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.List;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipOutputStream;
    import javax.servlet.http.HttpServletResponse;

    public class ZipUtils {

    /**
    * @param response
    * @param fileList 多文件列表
    * @param zipPath 压缩的文件暂存的目录,下载后会删除掉
    */
    public static void zipFiles(HttpServletResponse response, List<File> fileList, File zipPath) {
    // 1 文件压缩
    if (!zipPath.exists()) { // 判断压缩后的文件存在不,不存在则创建
    try {
    zipPath.createNewFile();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    FileOutputStream fileOutputStream=null;
    ZipOutputStream zipOutputStream=null;
    FileInputStream fileInputStream=null;
    try {
    fileOutputStream=new FileOutputStream(zipPath); // 实例化 FileOutputStream对象
    zipOutputStream=new ZipOutputStream(fileOutputStream); // 实例化 ZipOutputStream对象
    ZipEntry zipEntry=null; // 创建 ZipEntry对象
    for (int i=0; i<fileList.size(); i++) { // 遍历源文件数组
    fileInputStream = new FileInputStream(fileList.get(i)); // 将源文件数组中的当前文件读入FileInputStream流中
    zipEntry = new ZipEntry(fileList.get(i).getName()); // 实例化ZipEntry对象,源文件数组中的当前文件
    zipOutputStream.putNextEntry(zipEntry);
    int len; // 该变量记录每次真正读的字节个数
    byte[] buffer=new byte[1024]; // 定义每次读取的字节数组
    while ((len=fileInputStream.read(buffer)) > 0) {
    zipOutputStream.write(buffer, 0, len);
    }
    }
    zipOutputStream.closeEntry();
    zipOutputStream.close();
    fileInputStream.close();
    fileOutputStream.close();

    // 2 文件下载
    long currentTime=System.currentTimeMillis(); // 当时时间戳
    int randomFour=(int)((Math.random()*9+1)*1000); // 4位随机数
    String fileName=String.valueOf(currentTime)+String.valueOf(randomFour)+".zip"; // 新的文件名称
    String path=zipPath.toString();

    // 设置输出的格式
    response.reset();
    response.setContentType("bin");
    response.addHeader("Content-Disposition", "attachment; filename="" + fileName + """);

    // 循环取出流中的数据
    FileInputStream inStream=new FileInputStream(path); // 读到流中
    byte[] b = new byte[100];
    int len;
    try {
    OutputStream os=response.getOutputStream();
    response.setContentType("application/octet-stream");
    while ((len = inStream.read(b)) > 0){
    os.write(b, 0, len);
    }
    inStream.close();
    os.flush();
    os.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    } catch (IOException e) {
    e.printStackTrace();
    } finally {
    try { // 3 删除压缩包
    String path=zipPath.toString();
    File zfile = new File(path);
    zfile.delete();
    } catch (Exception e){
    e.printStackTrace();
    }
    }
    }
    }
     

    controller调用:

        @RequestMapping(value = "/batchDownload.do", method = RequestMethod.GET)
        public void batchDownload(HttpServletRequest request, HttpServletResponse response) {
    try { //ZipUtils.zipFiles(); } catch (Exception e) { e.printStackTrace(); System.out.println("batchDownload error"); } }
  • 相关阅读:
    ios中strong和weak的解释理解
    leetcode: Remove Duplicates from Sorted Array II [基本功]
    leetcode : Sort Colors
    leetcode : Search a 2D Matrix
    leetcode : Set Matrix Zeroes [技巧 follow up 逐步优化]
    leetcode : edit distance[hard][经典动态规划]
    leetcode : Climbing Stairs
    leetcode : Add Bianry 基本功 字符转整数
    leetcode : Plus One 基本功
    leetcode : Minimum Path Sum
  • 原文地址:https://www.cnblogs.com/chenmz1995/p/12301673.html
Copyright © 2020-2023  润新知