MinioUtils中removeObjects批量删除无效的解决办法

最近遇到一个minio的工具类中的批量删除无效,也不报错,一味的感觉是我的名字传的有问题(不知道带不带后缀名),先把我改之后的正确代码贴上

/**
     * 批量删除文件
     *
     * @param bucketName bucket
     * @param keys       需要删除的文件列表
     */
    public boolean removeObjects(String bucketName, List<String> keys) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException {
        List<DeleteObject> objects = new LinkedList<>();
        for (String objectName:keys){
            objects.add(new DeleteObject(objectName));
        }
        Iterable<Result<DeleteError>> results = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(objects).build());
        for (Result<DeleteError> result : results) {
            DeleteError error = result.get();
            log.error("Error in deleting object " + error.objectName() + "; " + error.message());
        }
        return true;
    }

后来从网上查资料,原来是因为没有遍历结果的原因,源码方法的上面有一句注释(但是我没找到这句注释),大致意思就是删除后一定要遍历结果,至于为啥这么做,我们稍后见。(现在也没见到为啥)
至于名字问题,需要两个参数,一个是桶的名字(这个好理解),另外一个是objectName,不知道带不带前面的文件夹名字,还是只是文件的名字,这里明确一下是带上文件夹的名字,就是存的时候传的objectName就可以了

String dirName = getDirName(fileType);

            if (!minioUtils.bucketExists(bucketName)) {
                minioUtils.createBucket(bucketName);
            }

            if (!minioUtils.doesFolderExist(bucketName, dirName)) {
                minioUtils.putDirObject(bucketName, dirName + "/");
            }
            Date date = new Date();
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
            String day = dateFormat.format(date);
            String uuid = UUID.randomUUID().toString();
            int index = file.getOriginalFilename().lastIndexOf(".");
            String newName = day +"-"+uuid.substring(11) + file.getOriginalFilename().substring(index);

            minioUtils.putObject(bucketName, dirName + "/" + newName, file.getInputStream());

            return ACCESS_URL + "/" + bucketName + "/" + dirName + "/" + newName;

minioUtils.putObject(bucketName, dirName + “/” + newName, file.getInputStream());
putObject的第二个参数就是objectName,就不用为这个名字纠结了(后缀名也在里面)。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
可以使用 Minio Java SDK 的 `removeObjects()` 方法来批量删除文件。 以下是一个示例代码: ```java import io.minio.*; import io.minio.errors.*; import java.io.*; import java.security.*; import java.util.*; public class MinioUtils { // 初始化 Minio 客户端 private static final MinioClient minioClient = MinioClient.builder() .endpoint("http://minio.example.com") .credentials("ACCESS_KEY", "SECRET_KEY") .build(); // 批量删除指定前缀的文件 public static void deleteObjects(String bucketName, String prefix) throws Exception { // 构造删除请求 List<String> objectNames = new ArrayList<>(); Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).prefix(prefix).build()); for (Result<Item> result : results) { objectNames.add(result.get().objectName()); } Iterable<Result<DeleteError>> errors = minioClient.removeObjects( RemoveObjectsArgs.builder().bucket(bucketName).objects(objectNames).build()); // 打印错误信息 for (Result<DeleteError> error : errors) { System.out.println("Error deleting object " + error.get().objectName() + ": " + error.get().message()); } } } ``` 在上面的示例代码,`deleteObjects()` 方法接受两个参数:`bucketName` 表示要删除的文件所在的存储桶名称,`prefix` 表示要删除的文件名前缀。该方法会列出所有与指定前缀匹配的文件名,并将它们添加到一个列表。然后,通过调用 `removeObjects()` 方法来批量删除这些文件。如果删除过程发生错误,会将错误信息打印到控制台。 注意,需要将 `ACCESS_KEY` 和 `SECRET_KEY` 替换为你的 Minio 访问密钥。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值