业务背景:
在开发过程中,我们会遇到需要对文件(单个或多个)进行压缩并下载的功能需求,这里记录一下压缩多个文件的实现过程,或许有更好的方式请大家补充
前端实现一个按钮调下载压缩包的接口
<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);
}
定义服务层接口实现类
@Overridepublic 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;}
这样就实现了一个将多个文件进行压缩并下载的功能啦