需要用到的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;
}
这个方法不会生成临时文件,直接获取源文件进行压缩下载
这是我在公司项目中提取出来了,可能需要根据不同的框架进行略微调整。