Удалить объекты с помощью AWS SDK V2?
Я пытаюсь перейти с AWS SDK V1.x на V2.2. Я не могу понять метод deleteObjects, хотя. Я нашел несколько примеров - все тот же:-(, который, кажется, никогда не использует список объектов для удаления (т.е. список присутствует, но никогда не устанавливается в объекте DeleteObjectsRequest - я предполагаю, что это где это должно быть установлено, но не вижу где). Как / где я могу предоставить список объектов? Примеры, которые я нахожу:
System.out.println("Deleting objects from S3 bucket: " + bucket_name);
for (String k : object_keys) {
System.out.println(" * " + k);
}
Region region = Region.US_WEST_2;
S3Client s3 = S3Client.builder().region(region).build();
try {
DeleteObjectsRequest dor = DeleteObjectsRequest.builder()
.bucket(bucket_name)
.build();
s3.deleteObjects(dor);
} catch (S3Exception e) {
System.err.println(e.awsErrorDetails().errorMessage());
System.exit(1);
}
2 ответа
Похоже, для назначения ключа объекта в s3 требуется еще несколько объектов. Это не проверено, я поставил ссылки на методы в конце.
System.out.println("Deleting objects from S3 bucket: " + bucket_name);
for (String k : object_keys) {
System.out.println(" * " + k);
}
Region region = Region.US_WEST_2;
S3Client s3 = S3Client.builder().region(region).build();
try {
ObjectIdentifier objectToDelete = ObjectIdentifier.Builder()
.key(KEY_OBJECT_TO_DELETE);
Delete delete_me Delete.Builder.objects(objectToDelete)
DeleteObjectsRequest dor = DeleteObjectsRequest.builder()
.bucket(bucket_name)
.delete(delete_me)
.build();
s3.deleteObjects(dor);
} catch (S3Exception e) {
System.err.println(e.awsErrorDetails().errorMessage());
System.exit(1);
}
Ключ для удаления https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/model/ObjectIdentifier.html
Удалить объект https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/model/ObjectIdentifier.Builder.html
Ранее принятый ответ был очень полезным, хотя он не был на 100% завершен. Я использовал это, чтобы написать следующий метод. Это в основном работает, хотя я не проверял его обработку ошибок особенно хорошо.
- Массив
String
ключи передаются, которые преобразуются в массивObjectIdentifier
это чтоdeleteObjects
требует. s3Client
а такжеlog
Предполагается, что были инициализированы в другом месте. Не стесняйтесь удалить регистрацию, если вам это не нужно.Метод в настоящее время возвращает количество успешно удаленных.
public int deleteS3Objects(String bucketName, String[] keys) { List<ObjectIdentifier> objIds = Arrays.stream(keys) .map(key -> ObjectIdentifier.builder().key(key).build()) .collect(Collectors.toList()); try { DeleteObjectsRequest dor = DeleteObjectsRequest.builder() .bucket(bucketName) .delete(Delete.builder().objects(objIds).build()) .build(); DeleteObjectsResponse delResp = s3client.deleteObjects(dor); if (delResp.errors().size() > 0) { String err = String.format("%d errors returned while deleting %d objects", delResp.errors().size(), objIds.size()); log.warn(err); } if (delResp.deleted().size() < objIds.size()) { String err = String.format("%d of %d objects deleted", delResp.deleted().size(), objIds.size()); log.warn(err); } return delResp.deleted().size(); } catch(AwsServiceException e) { // The call was transmitted successfully, but Amazon S3 couldn't process // it, so it returned an error response. log.error("Error received from S3 while attempting to delete objects", e); } catch(SdkClientException e) { // Amazon S3 couldn't be contacted for a response, or the client // couldn't parse the response from Amazon S3. log.error("Exception occurred while attempting to delete objects from S3", e); } return 0; }
(Бесплатный комментарий: мне кажется странным, что в AWS SDK v2.3.9 deleteObjects
требует Delete.Builder
а также ObjectIdentifier
ключи но getObject
а также putObject
принять строковые ключи. Почему не DeleteObjectsRequest.Builder
просто есть keys()
метод? Они официально не сказали, что SDK готов к производству AFAIK, поэтому некоторые из них могут быть изменены.)