注: 这里压缩包的名称默认为 bucketName.zip 可根据需求情况修改
压缩后的路径和Minio文件路径一直
java
/**
* 下载并压缩 Minio 桶中的文件,并通过 HTTP 响应输出
*
* @param bucketName 桶名称
* @param response HTTP 响应对象
*/
public static void downloadMinioFileToZip(String bucketName, HttpServletResponse response){
downloadMinioFileToZip(bucketName, "", response);
}
/**
* 下载并压缩 Minio 桶中的文件,并通过 HTTP 响应输出
*
* @param bucketName 桶名称
* @param folderPath 文件夹路径(可为空) 示例: data/png/
* @param response HTTP 响应对象
*/
public static void downloadMinioFileToZip(String bucketName, String folderPath, HttpServletResponse response) {
try {
// 如果 folderPath 为空,列出整个桶中的文件
if (folderPath == null || folderPath.isEmpty()) {
// 根目录
folderPath = "";
}
// 设置 HTTP 响应头
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment;filename=" + bucketName + ".zip");
// 创建 ZipOutputStream,将文件写入 response 的输出流
try (ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream())) {
// 列出文件夹中的所有对象
Iterable<Result<Item>> results = minioClient.listObjects(
ListObjectsArgs.builder().bucket(bucketName).prefix(folderPath).recursive(true).build()
);
// 下载并压缩文件夹中的所有对象
for (Result<Item> result : results) {
Item item = result.get();
String objectName = item.objectName();
log.info("找到对象: {}", objectName);
// 跳过目录对象,确保只处理实际文件
if (objectName.endsWith("/")) {
continue;
}
// 为每个对象创建一个新的 ZipEntry(压缩包中的文件条目)
ZipEntry zipEntry = new ZipEntry(objectName);
zipOut.putNextEntry(zipEntry);
// 从 MinIO 获取对象输入流
try (InputStream stream = minioClient.getObject(
GetObjectArgs.builder().bucket(bucketName).object(objectName).build())) {
// 将文件数据写入压缩包
byte[] buf = new byte[8192];
int bytesRead;
while ((bytesRead = stream.read(buf)) != -1) {
zipOut.write(buf, 0, bytesRead);
}
// 关闭当前文件条目
zipOut.closeEntry();
log.info("文件压缩成功: {}", objectName);
} catch (Exception e) {
log.error("下载并压缩文件时发生错误: {}", e.getMessage(), e);
}
}
log.info("所有文件已成功压缩并通过响应输出。");
} catch (IOException e) {
log.error("创建压缩包时发生错误: {}", e.getMessage(), e);
}
} catch (MinioException | InvalidKeyException | NoSuchAlgorithmException e) {
log.error("发生错误: {}", e.getMessage(), e);
}
}
示例接口
测试桶目录:
saas 桶名称
file1.img
file1.img
file1.img
tif ----------- 文件夹
innerFile1.img
innerFile1.img
java
@GetMapping("/testDownload")
public void testDownload(HttpServletResponse response) {
// 压缩指定文件夹文件
MinioUtils.downloadMinioFileToZip("saas","tif/", response);
// 不指定
MinioUtils.downloadMinioFileToZip("saas", response);
}
Minio相关配置及工具类在这篇中有描述