@Override
public void downloadZip(PageRequest<TransactionDetails> pr, HttpServletResponse response) {
response.setCharacterEncoding("utf-8");
response.setContentType("application/zip");
List<TransactionDetails> transactionDetails = list(pr.getWrapper());
List<String> receiptUrls = transactionDetails.stream().map(TransactionDetails::getReceiptUrl).collect(Collectors.toList());
try (ServletOutputStream outputStream = response.getOutputStream();
ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream)) {
for (String receiptUrl : receiptUrls) {
// 获取实际文件名称
Path path = Paths.get(receiptUrl);
Path fileName = path.getFileName();
// 放入压缩包
S3Object s3Object = fileTemplate.getObject(fileProperties.getBucketName(), null, fileName.toString());
byte[] bytes = IoUtil.readBytes(s3Object.getObjectContent());
try {
zipOutputStream.putNextEntry(new ZipEntry(String.valueOf(fileName)));
zipOutputStream.write(bytes);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
} catch (IOException e) {
log.error("下载文件异常", e);
}
}
如果要在压缩包上面一级在做文件夹分类,直接在newFileName前面加上文件夹路径即可。