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

/** * 下载并压缩 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); } }
上一篇:srs http-flv处理过程


下一篇:基于SSM(Spring + Spring MVC + MyBatis)框架的文物管理系统