最近遇到一个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,就不用为这个名字纠结了(后缀名也在里面)。