minIO中打包下载文件夹

思路:首先检查文件夹路径是否为正确,然后获取文件夹下所有文件的路径,根据这些路径再下载所有文件,然后将所有文件打包为一个zip压缩包。

判断是否为文件夹路径

说明:minio中不存在文件夹的概念,这里的文件夹实际表示文件的“前缀”。

public boolean folderExists(String folderPath) {
        ListObjectsArgs listObjectsArgs = ListObjectsArgs.builder()
                .bucket(minioConfig.getBucket()).prefix(folderPath)
                .recursive(false).build();
        Iterable<Result<Item>> iterable = minioClient.listObjects(listObjectsArgs);
        // 不为空则说明是文件夹
        return iterable.iterator().hasNext();
    }

批量获取文件路径(objectName)

通过文件夹路径获取文件夹下所有文件的objectName,然后根据objectName逐个下载即可。
注意:ListObjectsArgs.builder().recursive(true) 需要设置为true,否则无法获取文件夹下的文件路径

public List<String> getAllObjectNameInFolder(String folderPath) {
        ListObjectsArgs listObjectsArgs = ListObjectsArgs.builder()
                .bucket(minioConfig.getBucket()).prefix(folderPath)
                .recursive(true).build();
        Iterable<Result<Item>> results = minioClient.listObjects(listObjectsArgs);
        List<String> objectNameList = new ArrayList<>();
        for (Result<Item> item : results) {
            try {
                objectNameList.add(item.get().objectName());
            } catch (Exception e) {
                throw new MinioException(CommonErrorCode.MINIO_ERROR);
            }
        }
        return objectNameList;
    }

打包多个文件为zip压缩包

说明:FileVO类是自定义的一个类,里面包括filename和bytes两个字段

FileVO compressFilesToZip(String filename, List<FileVO> fileVOList) {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ZipOutputStream zipOut = new ZipOutputStream(bos);
        FileVO zipFile = new FileVO();
        for (FileVO fileVO : fileVOList) {
            try (InputStream inputStream = new ByteArrayInputStream(fileVO.getBytes())) {
                ZipEntry zipEntry = new ZipEntry(fileVO.getFilename());
                zipOut.putNextEntry(zipEntry);
                byte[] bytes = new byte[1024 * 1024];
                int length;
                while ((length = inputStream.read(bytes)) >= 0) {
                    zipOut.write(bytes, 0, length);
                }
                // 写入下一个zipEntry前需要先关闭
                zipOut.closeEntry();
            } catch (IOException e) {
                throw new WrappedIOException(e);
            }
        }
        try(bos; zipOut) {
            // 如果不调用finish()方法则会出现损坏的压缩包
            zipOut.finish();
            zipFile.setBytes(bos.toByteArray());
            zipFile.setFilename(filename);
        } catch (IOException e) {
            throw new WrappedIOException(e);
        }
        return zipFile;
    }
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值