思路:首先检查文件夹路径是否为正确,然后获取文件夹下所有文件的路径,根据这些路径再下载所有文件,然后将所有文件打包为一个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;
}