step01:构造文件打包模型
@Data
public class ZipFileDTO {
/**
* 每个文件的文件名称
*/
private List<String> fileNms;
/**
* 每个文件的流
*/
private List<ByteArrayOutputStream> streams;
/**
* 定义的压缩文件的名称
*/
private String zipFileNm;
}
step02:获取文件流
public static ByteArrayOutputStream convert(MultipartFile file) throws IOException {
try (InputStream input = file.getInputStream();){
// 获取文件输入流
// 创建字节数组输出流
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = input.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
return output;
} catch (Exception e){
log.error("文件读取错误:e", e);
}
return null;
}
step03:循环文件,写入文件名与文件流
List<String> fileNms = new ArrayList<>();
List<ByteArrayOutputStream> streams = new ArrayList<>();
//(按实际业务处理,省略)
for (XXXX xxxx: XXXXs) {
streams.add(xxxx.getByteArrayOutputStream());
fileNms.add(xxxx.getFileName());
}
ZipFileDTO zipFileDTO = new ZipFileDTO();
zipFileDTO.setZipFileNm(candidate.getChineseName() + "-附件.zip");
zipFileDTO.setStreams(streams);
zipFileDTO.setFileNms(fileNms);
step04: 根据文件模型进行压缩并放入response
public static void downloadZipFile(HttpServletResponse response, ZipFileDTO fileDTO) {
List<String> names = fileDTO.getFileNms();
List<ByteArrayOutputStream> streams = fileDTO.getStreams();
// 输出Excel文件
try (
OutputStream output = response.getOutputStream();
ZipOutputStream zipStream = new ZipOutputStream(output)
) {
String filename = URLEncoder.encode(fileDTO.getZipFileNm(), StandardCharsets.UTF_8.toString());
response.setHeader("Content-Disposition", "attachment;filename=" + filename);
response.setContentType(MediaType.APPLICATION_OCTET_STREAM.toString());
// 创建压缩文件,并进行打包
for (int i = 0; i < names.size(); i++) {
ZipEntry z = new ZipEntry(names.get(i));
zipStream.putNextEntry(z);
streams.get(i).writeTo(zipStream);
}
zipStream.flush();
} catch (Exception e) {
log.error("downloadZipFile错误:e", e);
}
}