удалить объекты с помощью AWS SDK V2? - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь перейти с 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 ]

0 голосов
/ 02 февраля 2019

Ранее принятый ответ был очень полезным, хотя он и не был на 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, поэтому некоторые из них могут быть изменены.)

0 голосов
/ 28 декабря 2018

Похоже, для назначения ключа объекта в 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#key--

Удалить объект https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/model/ObjectIdentifier.Builder.html

...