ps: 需要注意的是此方法即使只有一个文件也是导出成zip,所以如果需求是单个文件不压缩,多个文件才打包压缩的话需要前端处理调两个接口.这里只贴出打包导出的代码.
直接上Controller层代码,如下 :
@ApiOperation("导出多个xlsx文件")
@RequestMapping(path = "/exportMore", method = RequestMethod.GET)
@ResponseBody
public void downloadFile(HttpServletRequest request,HttpServletResponse response, @RequestParam @ApiParam(value = "业务对象id,中间用,分隔", required = true) String ids) throws Exception {
try {
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition", "attachment; filename=" + "export.zip");
compressZip(ids, response.getOutputStream());
} catch (IOException e) {
}
}
//----------------------------------下面是封装好的私有方法---------------------------------
/**
* 多个文件打包压缩下载方法
*
* @param outputStream
*/
private void compressZip(String ids, OutputStream outputStream) {
//我这里的ids是实体对象的id用英文逗号分隔拼成的字符串,
//到业务实现类里面拿着去数据层取对象生成文件的,根据你们需求不同可以改
ZipOutputStream zipOutStream = null;
//------根据需求的不同每个人不一样,反正走完for循环得到一个文件集合就行-----
List<File> fileList = Lists.newArrayList();
for (String id : ids.split(",")) {
//------这一步是文件生成并给出路径,或者直接拿已有的文件的路径-----
String filePath = xxxXxxService.makeFile(id);
File file = new File(filePath);
fileList.add(file);
}
try {
//-- 包装成ZIP格式输出流
zipOutStream = new ZipOutputStream(new BufferedOutputStream(outputStream));
// -- 设置压缩方法
zipOutStream.setMethod(ZipOutputStream.DEFLATED);
//-- 下面将多文件循环写入压缩包
for (File file : fileList) {
byte[] data = Files.readAllBytes(file.toPath());
zipOutStream.putNextEntry(new ZipEntry(file.getName()));
zipOutStream.write(data);
zipOutStream.closeEntry();
zipOutStream.flush();
//不需要删除缓存文件的话不要下面这行
file.delete();
}
} catch (IOException e) {
log.error(......)
} finally {
IOUtils.closeQuietly(zipOutStream);
IOUtils.closeQuietly(outputStream);
}
}