批量下载并压缩

93 阅读1分钟

需要用到的jar

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-compress</artifactId>
    <version>1.19</version>
</dependency>


<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.1.0</version>
</dependency>

文件类

public class AttachFile implements Serializable {
    private static final long serialVersionUID = 5155207649561908608L;
    private String id;
    private String fileName;
    private String filePath;
    
    public AttachFile(){}
    
    public AttachFile(String id){
       this.id=id;
    }
    
    public String getId(){
       return this.id;
    }
    public void setId(String id){
       this.id=id;
    }
    
    public String getFileName(){
       return this.fileName;
    }
    public void setFileName(String fileName){
       this.fileName=fileName;
    }
    
    public String getFilePath(){
       return this.filePath;
    }
    public void setFilePath(String filePath){
       this.filePath=filePath;
    }
    
 }

批量下载并压缩方法

/**
 * 批量下载附件
 */
public ModelAndView batchDownload(HttpServletRequest request, HttpServletResponse response) throws IOException {

    String id = request.getParameter("id");
    List<AttachFile> attachList = attachFileService.getAttachFiles();
    if (attachList.size() > 0) {

        ZipArchiveOutputStream zous = null;
        String tmpDir = "";
        FileUtil.mkdir(tmpDir);
        try {
            //设置响应
            response.reset();
            response.setContentType("application/octet-stream");
            response.setHeader("Accept-Ranges", "bytes");

            String fileName = URLEncoder.encode("批量下载.zip", "UTF-8").replaceAll("\\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName);
            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
            //参数组装
            zous = new ZipArchiveOutputStream(response.getOutputStream());
            zous.setUseZip64(Zip64Mode.AsNeeded);

            for (AttachFile att : attachList) {
                ArchiveEntry entry = new ZipArchiveEntry(att.getFileName());
                zous.putArchiveEntry(entry);

                File file = new File(Constants.FILE_UPLOAD_PATH + att.getFilePath());
                InputStream inputStream = new FileInputStream(file);
                int len;
                byte[] bytes = new byte[1024];
                while ((len = inputStream.read(bytes)) != -1) {
                    zous.write(bytes, 0, len);
                }
                IoUtil.close(inputStream);

                zous.closeArchiveEntry();
                zous.flush();
            }
            zous.closeArchiveEntry();
        } finally {
            if (zous != null) {
                zous.close();
            }
        }
    }

    return null;
}

这个方法不会生成临时文件,直接获取源文件进行压缩下载

这是我在公司项目中提取出来了,可能需要根据不同的框架进行略微调整。