目录
1、业务背景:
根据输入的linux 服务器的账号信息通过sftp ftp 两种连接方式批量下载文件
2、遇到问题
批量下载文件返回多个流给前端让挨个下载,不是很合适,所以的将文件打成zip包下载
3、代码实现
批量下载需要和原先名字对应,所以是map的形式,key是下载的路径,value是文件的输出流,设置响应头的目的是告诉浏览器这是下载文件格式为zip,然后就是将流往zip里写,都是jdk包下的
public void batchDownloadFiles(@PathVariable String assetId, @RequestBody List<String> filePaths, HttpServletResponse response) {
Map<String, byte[]> bytesMap = dampAssetInfoService.batchDownloadFiles(assetId, filePaths);
try {
// 设置响应头
response.setHeader("Content-Disposition", "attachment; filename=files.zip");
response.setContentType("application/zip");
// 创建输出流
ServletOutputStream outputStream = response.getOutputStream();
ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);
// 将字节流写入压缩文件
for (int i = 0; i < filePaths.size(); i++) {
String filePath = filePaths.get(i);
String fileName = StringUtils.getFileName(filePath);
if (!bytesMap.containsKey(filePath)) {
continue;
}
byte[] data = bytesMap.get(filePath);
ZipEntry zipEntry = new ZipEntry(fileName);
zipOutputStream.putNextEntry(zipEntry);
zipOutputStream.write(data);
zipOutputStream.closeEntry();
}
// 关闭流
zipOutputStream.close();
outputStream.close();
} catch (IOException e) {
// 处理异常
}
}