业务背景:
在开发过程中,我们会遇到需要对文件(单个或多个)进行压缩并下载的功能需求,这里记录一下压缩多个文件的实现过程,或许有更好的方式请大家补充
前端实现一个按钮调下载压缩包的接口
<button icon="download" type="primary" @click="download">
下载压缩包
<button>
<script>
download () {
location.href = faceConfig.basePath + '/download?' +
'&fileIds=' + paramData.fileIds + //业务参数,根据实际情况写
},
</script>
后端接口实现:
controller控制层定义下载压缩包接口
@GetMapping("download")
public void download(String fileIds){
readService.download(fileIds,getResponse());
}
定义service服务层接口
public interface ReadService {
void download(String fileIds, HttpServletResponse response);
}
定义服务层接口实现类
@Override
public void download(String fileIds, HttpServletResponse response) {
String[] Ids = fileIds.split(",");
Map map = new HashMap();
Map bas64Map = new HashMap();
File[] file = new File[Ids.length];
File file1 = null;
OutputStream output = null;
BufferedOutputStream bufferedOutput = null;
FileInputStream inStream = null;
try {
for (int i = 0; i < Ids.length; i++) {
// 1.获取到要压缩的文件,这里是自己的业务逻辑,可根据实际情况去写,只要最后能拿到file就行
Map paramMap = new HashMap();
paramMap.put("Id", Ids[i]);
map = certificatePrintReadMapper.getFileInfo(paramMap);
bas64Map = WaterMarkUtils.createStringMark(map);
String base64 = (String) bas64Map.get("qj");
byte[] bytes = decode(base64);
file1 = new File(Ids[i] + "证书.jpg");
output = new FileOutputStream(file1);
bufferedOutput = new BufferedOutputStream(output);
bufferedOutput.write(bytes);
// 2。文件放到文件数组里
file[i] = file1;
output.close();
bufferedOutput.close();
}
// 3.创建压缩文件,将文件数组进行压缩
File zip = new File("压缩包名字.zip");// 压缩文件
zipFiles(file, zip);
response.setContentType("*/*");
response.addHeader("Content-Disposition", "attachment;filename=" + new String("压缩包名字.zip".getBytes(), "ISO8859-1"));
ServletOutputStream outputStream = response.getOutputStream();
inStream = new FileInputStream(zip);
byte[] buf = new byte[4096];
int readLength;
while (((readLength = inStream.read(buf)) != -1)) {
outputStream.write(buf, 0, readLength);
}
inStream.close();
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bufferedOutput != null) {
try {
bufferedOutput.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (inStream != null) {
try {
inStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//子方法,压缩文件
public static void zipFiles(File[] srcfile, File zipfile) {
byte[] buf = new byte[1024];
FileInputStream in = null;
try {
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
zipfile), StandardCharsets.UTF_8);
//File file2 = null;
for (int i = 0; i < srcfile.length; i++) {
String filename = srcfile[i].getName();
in = new FileInputStream(srcfile[i]);
out.putNextEntry(new ZipEntry(filename));
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
// out.setEncoding("GBK");
out.closeEntry();
in.close();
System.out.println(srcfile[i].delete());
}
out.close();
} catch (IOException e) {
//e.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException e) {
//e.printStackTrace();
}
}
}
//子方法,将Base64转成字节数组
public static byte[] decode(String str) {
byte[] b = null;
String result = null;
if (str != null) {
BASE64Decoder decoder = new BASE64Decoder();
try {
b = decoder.decodeBuffer(str);
// result = new String(b, "utf-8");
} catch (Exception e) {
}
}
return b;
}
这样就实现了一个将多个文件进行压缩并下载的功能啦