在最近写的项目中用到的批量打包下载。
作为一个比较懒的程序员,我是不会自己动手一点一点敲得,肯定是面向百度编程的啊,下面就是我copy的代码了,写这个只是为了方便自己。
下面展示一些 内联代码片
。
// An highlighted block
package cn.czfx.fxsys_zwoa.util;
import lombok.experimental.UtilityClass;
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@UtilityClass
public class ZipUtil {
public void fileToZip(String filePath,String fileName,ZipOutputStream zipOut) throws IOException {
// 需要压缩的文件
File file = new File(filePath);
// 获取文件名称,如果有特殊命名需求,可以将参数列表拓展,传fileName
FileInputStream fileInput = new FileInputStream(filePath);
// 缓冲
byte[] bufferArea = new byte[1024 * 10];
BufferedInputStream bufferStream = new BufferedInputStream(fileInput, 1024 * 10);
// 将当前文件作为一个zip实体写入压缩流,fileName代表压缩文件中的文件名称
zipOut.putNextEntry(new ZipEntry(fileName));
int length = 0;
// 最常规IO操作,不必紧张
while ((length = bufferStream.read(bufferArea, 0, 1024 * 10)) != -1) {
zipOut.write(bufferArea, 0, length);
}
//关闭流
fileInput.close();
// 需要注意的是缓冲流必须要关闭流,否则输出无效
bufferStream.close();
// 压缩流不必关闭,使用完后再关
}
}
下面呢是我调用的地方,代码简陋海涵。没有封装好,将就用了,小公司嘛。
下面展示一些 内联代码片
。
// An highlighted block
//fileList的数据格式是 {xxx_xxx软件开发工程师=/file/20210422/20210422102652_qT0Fd.docx, 前端功能小技巧(1)=/file/20210422/20210422102652_VFXos.doc, 前端功能小技巧=/file/20210421/20210421114858_MpQ3x.doc}
//fileList 是存放 文件名=文件url 键值对的map
Map<String, String> fileList = new HashMap<>();
System.out.println(fileList);
// 创建临时路径,存放压缩文件
String zipFilePath = "D:/我的zip.zip";
// 压缩输出流,包装流,将临时文件输出流包装成压缩流,将所有文件输出到这里,打成zip包
ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFilePath));
for (String s : fileList.keySet()) {
try {
//fileUploadPath 是配置文件中的存储路径 拼接成完整的路径
String fileUrl = fileUploadPath+"/"+sitePre+fileList.get(s);
String[] split = fileUrl.split("\\.");
//文件名很重要,一定要拼接文件的后缀名
String fileName =s+"."+split[1];
//调用工具类传入参数文件的url,文件名,和压缩包对象
ZipUtil.fileToZip(fileUrl,fileName,zipOut);
} catch (IOException e) {
e.printStackTrace();
}
}
// 压缩完成后,关闭压缩流
zipOut.close();
//拼接下载默认名称并转为ISO-8859-1格式
String fileName = new String(("基础数据管理文档下载.zip").getBytes(),"ISO-8859-1");
response.setHeader("Content-Disposition", "attchment;filename="+fileName);
//该流不可以手动关闭,手动关闭下载会出问题,下载完成后会自动关闭
ServletOutputStream outputStream = response.getOutputStream();
FileInputStream inputStream = new FileInputStream(zipFilePath);
// 如果是SpringBoot框架,在这个路径
// org.apache.tomcat.util.http.fileupload.IOUtils产品
// 否则需要自主引入apache的 commons-io依赖
// copy方法为文件复制,在这里直接实现了下载效果
IOUtils.copy(inputStream, outputStream);
// 关闭输入流
inputStream.close();
//下载完成之后,删掉这个zip包
File fileTempZip = new File(zipFilePath);
fileTempZip.delete();