最新实战案例锦集:《Spring Boot3实战案例合集》持续更新,每天至少更新一篇文章,订阅后将赠送文章最后展示的所有MD文档(学习笔记)。
环境:SpringBoot3.2.5
1. 简介
在 Spring Boot 项目中,经常需要通过 REST API 自动生成 ZIP 压缩文件并提供下载功能。这种场景常见于需要将多个文件打包成一个压缩文件返回给客户端的应用程序中。为了确保数据的安全性,特别是在涉及敏感信息时,还需要为生成的 ZIP 文件设置解压密码。
在本篇文章中,我们将探讨如何在 Spring Boot 项目中实现这一需求。我们将详细介绍如何通过 REST API 动态生成带有密码保护的 ZIP 文件。通过本教程,你将学习到如何生成压缩文件并向其中添加文件、设置密码保护及优化用户体验的技巧。
接下来,我们会综合应用4个案例来讲解,如下:
读取磁盘文件写入压缩包
直接读取文件写入到压缩包中,最终在Controller中以字节的形式写到客户端。
以流的方式写入客户端
这种方式大大的提供了系统的性能,并且还不会阻塞服务器线程,以异步的方式输出到客户端。
保护压缩包安全设置密码
对于敏感数据,我们通常会要求最终生成的压缩文件设置解压密码。
与数据库结合
大多数场景我们的数据都来自数据库,最后将查询到的数据以压缩文件的形式让用户下载。
2. 实战案例
2.1 以字节数组作为响应
首先,第一种方法是将 ZIP 文件创建为字节数组并在 HTTP 响应中返回。
"/zip-archive", produces = "application/zip") (value =
public ResponseEntity<byte[]> getZipBytes() throws IOException {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(byteArrayOutputStream);
ZipOutputStream zipOutputStream = new ZipOutputStream(bufferedOutputStream);
addFiles(zipOutputStream) ;
IOUtils.closeQuietly(bufferedOutputStream) ;
IOUtils.closeQuietly(byteArrayOutputStream) ;
String fileName = URLEncoder.encode("我的压缩文件.zip", "UTF-8");
return ResponseEntity
.ok()
.header("Content-Disposition", "attachment; filename=\"" + fileName + "\"")
.body(byteArrayOutputStream.toByteArray()) ;
}
该接口我们设置了 produces 属性为 application/zip,这是 ZIP 存档的 MIME 类型。然后,我们用 ZipOutputStream 封装 ByteArrayOutputStream,并在其中添加所有需要的文件。最后,我们通过 Content-Disposition Header设置为附件值,这样我们就能在调用后下载存档。
addFiles方法如下: