压缩Minio桶中的文件为ZIP,并通过 HTTP 响应输出

注: 这里压缩包的名称默认为 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相关配置及工具类在这篇中有描述

Minio工作类MinioUtils的配置及使用示例

相关推荐
沫璃染墨7 小时前
从零入门计算机网络系列(十四):TCP报文与字节流本质——从数据封装到报文边界
linux·服务器·网络·网络协议·tcp/ip·tcp
byte轻骑兵9 小时前
【LMP】规范精讲[13]: 参数的户口本、公钥的集装箱与出厂的兜底值
人工智能·网络协议·人机交互·lmp·蓝牙链路管理
流浪0019 小时前
计算机网络篇17:传输层——TCP 超时重传、三次握手与四次挥手,TIME_WAIT 为什么要等 2MSL
网络协议·tcp/ip·计算机网络·三次握手·四次挥手·超时重传
anew___21 小时前
《从零手写操作系统 (63):安全与加固——从内核保护到沙箱隔离》
网络·安全
Lzg_na21 小时前
VXLAN:背景、机制、报文字段与主机转发流程
网络
乐维_lwops1 天前
案例解读:大型综合性科创产业园运维监控落地实践
运维·网络·人工智能·安全·it监控·国产运维智能体
m0_715674431 天前
政务泛监测体系能力排行:AI 重塑监测边界,治理的颗粒度革命
大数据·网络·人工智能·安全·网络安全·政务
AI 编程助手GPT1 天前
curl 返回成功就能收文件?用本地 HTTP 验证错误页与超时
网络·网络协议·http
十碗饭吃不饱1 天前
后端运维:网络联通、进程查询、Java服务启动脚本
java·运维·网络
流浪0011 天前
计算机网络篇16:传输层——TCP 报头属性字段:16 位窗口大小撑起流量控制,六个标志位标识报文类型
网络协议·tcp/ip·计算机网络·urg紧急指针·tcp报头