前言
接到个需求,从数据库查询出多个用户,每个用户都会有头像,以压缩包的方式下载这些用户的头像,这里用到了java.util.zip
包下的zip工具类。
逻辑流程
-
获取前端请求接口和参数。
-
查询所有用户头像地址,并使用
List<String> filePaths
存储。 -
调用文件压缩方法。
-
写出文件流。
-
关闭文件流。
代码
请求接口
/**
* 批量导出附件,附件以压缩包的形式下载
*/
@RequestMapping(value = "/downZip", method = RequestMethod.GET)
public void downZip(Long projectId, String keyword, HttpServletRequest request, HttpServletResponse response) {
requiredCheck(projectId);
Map<String, String> map = new HashMap<>();
map.put("project.id", projectId.toString());
List<CbcAddressBook> books = cbcAddressBookService.baseApiListObj(request, map, null, keyword, null, new String[]{"fileName"}, null).getResultData();
List<String> filePaths = new LinkedList<>();
for (int i = 0; i < books.size(); i++) {
CbcAddressBook book = books.get(i);
ifNullThrow(book.getFile(), "第" + (i + 1) + "行话单未上传文件");
filePaths.add(getTomcatRootPath() + book.getFile().getRelativePath());
}
OutputStream out = null;
ZipOutputStream zos = null;
BufferedInputStream bis = null;
try {
out = response.getOutputStream();
//创建压缩文件需要的空的zip包
String zipBasePath = getTomcatRootPath() + "/upload/attachZip /";
String zipName = DateUtil.ISO_DATETIME_FORMAT_NONE.format(new Date()) + ".zip";
String zipFilePath = zipBasePath + File.separator + zipName;
//压缩文件
File zip = new File(zipFilePath);
if (!zip.exists()) {
zip.createNewFile();
}
//创建zip文件输出流
zos = new ZipOutputStream(new FileOutputStream(zip));
zipFile(zipBasePath, zipName, zipFilePath, filePaths, zos);
zos.close();
response.setContentType("text/html; charset=UTF-8"); //设置编码字符
response.setContentType("application/octet-stream"); //设置内容类型为下载类型
response.setHeader("Content-disposition", "attachment;filename=" + zipName);//设置下载的文件名称
//将打包后的文件写到客户端,输出的方法同上,使用缓冲流输出
bis = new BufferedInputStream(new FileInputStream(zipFilePath));
byte[] buff = new byte[bis.available()];
bis.read(buff);
out.flush();//释放缓存
out.write(buff);//输出数据文件
} catch (IOException e) {
e.printStackTrace();
throw new GeneralBizException("-------------文件下载失败----------------");
} finally {
doClose(bis, out, zos);
}
}
压缩文件方法
/**
* 压缩文件
*
* @param zipBasePath 临时压缩文件基础路径
* @param zipName 临时压缩文件名称
* @param zipFilePath 临时压缩文件完整路径
* @param filePaths 需要压缩的文件路径集合
* @throws IOException
*/
private String zipFile(String zipBasePath, String zipName, String zipFilePath, List<String> filePaths, ZipOutputStream zos) throws IOException {
//循环读取文件路径集合,获取每一个文件的路径
for (String filePath : filePaths) {
File inputFile = new File(filePath); //根据文件路径创建文件
if (inputFile.exists()) { //判断文件是否存在
if (inputFile.isFile()) { //判断是否属于文件,还是文件夹
//创建输入流读取文件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inputFile));
//将文件写入zip内,即将文件进行打包
zos.putNextEntry(new ZipEntry(inputFile.getName()));
//写入文件的方法,同上
int size = 0;
byte[] buffer = new byte[1024]; //设置读取数据缓存大小
while ((size = bis.read(buffer)) > 0) {
zos.write(buffer, 0, size);
}
//关闭输入输出流
zos.closeEntry();
bis.close();
} else { //如果是文件夹,则使用穷举的方法获取文件,写入zip
try {
File[] files = inputFile.listFiles();
List<String> filePathsTem = new ArrayList<String>();
for (File fileTem : files) {
filePathsTem.add(fileTem.toString());
}
return zipFile(zipBasePath, zipName, zipFilePath, filePathsTem, zos);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
return null;
}
关闭文件流
private void doClose(InputStream inputStream, OutputStream... outputStreams) {
try {
if (isNotNull(inputStream)) {
inputStream.close();
}
if (isNotNull(outputStreams) && outputStreams.length > 0) {
for (OutputStream outputStream : outputStreams) {
outputStream.close();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99236.html