根据业务批量下载成一个压缩包接口实现
@GetMapping(value = "batchDownLoad")
public Result batchDownLoad(String uuid, HttpServletResponse response) {
//下载的压缩包的名
String downloadFilename = UUID.randomUUID().toString().replace("-", "");
log.info("下载的压缩包的名:" +downloadFilename);
ZipOutputStream zos = null;
InputStream in = null;
try {
response.setContentType("application/octet-stream");// 指明response的返回对象是文件流
response.setHeader("Content-Disposition", "attachment; filename=" +downloadFilename + ".zip");
zos = new ZipOutputStream(response.getOutputStream());
List<String> collect = new ArrayList<>();
HashMap<String, InputStream> fileMap = new HashMap<>();
List<ParkNoticeDetailsForm> parkNoticeDetailsForms = parkNoticeDetailsService.selectByUuid(uuid);
if (!CollectionUtils.isEmpty(parkNoticeDetailsForms)) {
collect= parkNoticeDetailsForms.stream().filter(p -> p.getFileUrl() != null).map(ParkNoticeDetailsForm::getFileUrl).collect(Collectors.toList());
}
if (CollectionUtils.isEmpty(collect)){
return Result.customFail("没有可下载的文件");
}
for (String string : collect) {
String[] split1 = string.split(",");
for (String s: split1) {
InputStream fileInputStream = fileUploader.getFileInputStream(s);
String[] split = s.split("-");
fileMap.put(split[split.length-1], fileInputStream);
}
}
for (Map.Entry<String, InputStream> fileMaps : fileMap.entrySet()) {
String newFileName = fileMaps.getKey();
//打压缩包
//entry.getKey()就是上述所说的最外层的文件夹,也是自己定义的。
zos.putNextEntry(new ZipEntry(newFileName));
//文件路径放入流
in = fileMaps.getValue();
byte[] buffer = new byte[1024];
int r = 0;
while ((r = in.read(buffer)) != -1) {
zos.write(buffer, 0, r);
}
in.close();
zos.flush();
}
} catch (Exception e) {
// log.error("zipFiles error!!", e);
} finally {
if (zos!=null) {
try {
zos.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
zos.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
if (in!=null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}