private void multiDownload(List<DownloadFileReqVo> fileReqVoList, HttpServletResponse resp) throws BaseAppException {
try {
File zipFile = File.createTempFile("downloadImage4Wms", ".zip");
buildZipFile(fileReqVoList, resp, zipFile);
} catch (IOException e) {
log.error("tempFile create failed, msg: " + e.getMessage(), e);
}
}
private void buildZipFile(List<DownloadFileReqVo> fileReqVoList, HttpServletResponse resp, File zipFile) throws BaseAppException {
FileInputStream fis = null;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
OSSClient ossClient = null;
try (FileOutputStream fos = new FileOutputStream(zipFile);
CheckedOutputStream cos = new CheckedOutputStream(fos, new Adler32());
ZipOutputStream zos = new ZipOutputStream(cos);
) {
ossClient = new OSSClient(OssConfig.OSS_END_POINT, OssConfig.OSS_ACCESS_KEY_ID, OssConfig.OSS_ACCESS_KEY_SECRET);
Map<String, Integer> nameMap = new HashMap<>();
buildFile(fileReqVoList, zos, ossClient, nameMap);
zos.close();
String fileName = URLEncoder.encode(FHHD_NAME, Constants.ENCODING_UTF8);
String dateNow = DateUtils.date2String(DateUtils.getNowDate(), DateUtils.DATE_FORMAT_NOSPLIT);
fileName = fileName + dateNow + ".zip";
resp.reset();
resp.setContentType("application/octet-stream; charset=utf-8");
resp.setHeader("Location", fileName);
resp.setHeader("Cache-Control", "max-age=0");
resp.setHeader("Content-Disposition", "attachment; filename=" + fileName);
fis = new FileInputStream(zipFile);
bis = new BufferedInputStream(fis);
bos = new BufferedOutputStream(resp.getOutputStream());
byte[] buffer = new byte[1024];
int l = 0;
while (l < zipFile.length()) {
int j = bis.read(buffer, 0, 1024);
l += j;
bos.write(buffer, 0, j);
}
} catch (Exception e) {
log.error("multifile download4OssPri failed, msg: " + e.getMessage(), e);
throw new BaseAppException("multifile download4OssPri failed, msg: " + e.getMessage(), e);
} finally {
if (null != ossClient) {
ossClient.shutdown();
}
IOUtils.closeQuietly(fis, bis, bos);
try {
Files.delete(zipFile.toPath());
} catch (IOException e) {
log.error("tempFile delete failed, msg: " + e.getMessage(), e);
}
}
}
private void buildFile(List<DownloadFileReqVo> fileReqVoList, ZipOutputStream zos, OSSClient ossClient, Map<String, Integer> nameMap) throws IOException {
for (DownloadFileReqVo fileReqVo : fileReqVoList) {
OSSObject ossObject = ossClient.getObject(OssConfig.OSS_PRI_BUCKET_NAME, fileReqVo.getDopFilePath());
InputStream inputStream = ossObject.getObjectContent();
String name = fileReqVo.getDopFileName();
if (Utils.notEmpty(nameMap.get(name))) {
nameMap.put(name, nameMap.get(name) + 1);
name = name.substring(0, name.lastIndexOf(".")) + " ("+ nameMap.get(name) +")" + name.substring(name.lastIndexOf("."));
} else {
nameMap.put(name, 0);
}
zos.putNextEntry(new ZipEntry(name));
int bytesRead = 0;
while ((bytesRead = inputStream.read()) != -1) {
zos.write(bytesRead);
}
inputStream.close();
zos.closeEntry();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)