Comment vérifier si une clé spécifiée existe dans un compartiment S3 donné en utilisant Java


Je voudrais vérifier si une clé existe dans un compartiment donné en utilisant Java. J'ai regardé l'API mais il n'y a aucune méthode utile. J'ai essayé d'utiliser getObject, mais il a jeté une exception.

Author: lmichelbacher, 2011-11-29

13 answers

Utilisez la bibliothèque jets3t. C'est beaucoup plus facile et robuste que le sdk AWS. En utilisant cette bibliothèque, vous pouvez appeler, s3service.getObjectDetails(). Cela vérifiera et récupérera uniquement les détails de l'objet (pas le contenu) de l'objet. Il lancera un 404 si l'objet est manquant. Vous pouvez donc attraper cette exception et la gérer dans votre application.

Mais pour que cela fonctionne, vous devrez avoir un accès ListBucket pour l'utilisateur sur ce compartiment. L'accès GetObject ne fonctionnera pas. La raison en est qu'Amazon vous empêchera de vérifier la présence de la clé si vous n'avez pas accès à ListBucket. Le simple fait de savoir si une clé est présente ou non suffira également aux utilisateurs malveillants dans certains cas. Par conséquent, à moins qu'ils n'aient accès à ListBucket, ils ne pourront pas le faire.

 4
Author: sethu, 2011-11-29 01:28:20

Il existe maintenant une méthode doesObjectExist dans l'API Java officielle.

Profitez-en!

 196
Author: lmichelbacher, 2017-02-20 17:42:47

Utiliser errorCode.equals("NoSuchKey")

try {
    AmazonS3 s3 = new AmazonS3Client(new ClasspathPropertiesFileCredentialsProvider());
    String bucketName = getBucketName();
    s3.createBucket(bucketName);
    S3Object object = s3.getObject(bucketName, getKey());
} catch (AmazonServiceException e) {
    String errorCode = e.getErrorCode();
    if (!errorCode.equals("NoSuchKey")) {
        throw e;
    }
    Logger.getLogger(getClass()).debug("No such key!!!", e);
}

Remarque à propos de l'exception: je sais que les exceptions ne doivent pas être utilisées pour le contrôle de flux. Le problème est qu'Amazon n'a fourni aucune API pour vérifier ce flux - juste de la documentation sur l'exception.

 49
Author: AlikElzin-kilaka, 2014-10-14 10:53:22

Utilisation du SDK AWS utilisez la méthode getObjectMetadata. La méthode lancera une AmazonServiceException si la clé n'existe pas.

private AmazonS3 s3;
...
public boolean exists(String path, String name) {
    try {
        s3.getObjectMetadata(bucket, getS3Path(path) + name); 
    } catch(AmazonServiceException e) {
        return false;
    }
    return true;
}
 20
Author: user979051, 2013-01-29 16:03:38

Dans Amazon Java SDK 1.10+, vous pouvez utiliser getStatusCode() pour obtenir le code de statut de la réponse HTTP, qui sera 404 si l'objet n'existe pas.

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.AmazonS3Exception;
import org.apache.http.HttpStatus;

try {
    AmazonS3 s3 = new AmazonS3Client();
    S3Object object = s3.getObjectMetadata("my-bucket", "my-client");
} catch (AmazonS3Exception e) {
    if (e.getStatusCode() == HttpStatus.SC_NOT_FOUND) {
        // bucket/key does not exist 
    } else {
        throw e;
    }
}

getObjectMetadata() consomme moins de ressources, et la réponse n'a pas besoin d'être fermé comme getObject().


Dans les versions précédentes, vous pouvez utiliser getErrorCode() et vérifier la chaîne appropriée (dépend de la version).

 10
Author: Paul Draper, 2015-08-04 17:57:27

Utilisez le préfixe de réglage ListObjectsRequest comme clé.

Code. NET:

 public bool Exists(string key)
    {

        using (Amazon.S3.AmazonS3Client client = (Amazon.S3.AmazonS3Client)Amazon.AWSClientFactory.CreateAmazonS3Client(m_accessKey, m_accessSecret))
        {
            ListObjectsRequest request = new ListObjectsRequest();
            request.BucketName = m_bucketName;
            request.Prefix = key;
            using (ListObjectsResponse response = client.ListObjects(request))
            {

                foreach (S3Object o in response.S3Objects)
                {
                    if( o.Key == key )
                        return true;
                }
                return false;
            }
        }
    }.
 5
Author: user34402, 2013-05-16 14:05:23

Pour PHP (je sais que la question est Java, mais Google m'a amené ici), vous pouvez utiliser des wrappers de flux et file_exists

$bucket = "MyBucket";
$key = "MyKey";
$s3 = Aws\S3\S3Client->factory([...]);
$s3->registerStreamWrapper();
$keyExists = file_exists("s3://$bucket/$key");
 5
Author: Rich Remer, 2014-07-16 21:00:50

Ce code java vérifie si la clé (fichier) existe dans le compartiment s3.

public static boolean isExistS3(String accessKey, String secretKey, String bucketName, String file) {

    // Amazon-s3 credentials
    AWSCredentials myCredentials = new BasicAWSCredentials(accessKey, secretKey); 
    AmazonS3Client s3Client = new AmazonS3Client(myCredentials); 

    ObjectListing objects = s3Client.listObjects(new ListObjectsRequest().withBucketName(bucketName).withPrefix(file));

    for (S3ObjectSummary objectSummary: objects.getObjectSummaries()) {
        if (objectSummary.getKey().equals(file)) {
            return true;
        }
    }
    return false;
}
 4
Author: c0mrade, 2013-05-23 15:55:50

Utilisation de l'ist d'objet. Fonction Java pour vérifier si la clé spécifiée existe dans AWS S3.

boolean isExist(String key)
    {
        ObjectListing objects = amazonS3.listObjects(new ListObjectsRequest().withBucketName(bucketName).withPrefix(key));

        for (S3ObjectSummary objectSummary : objects.getObjectSummaries())
        {
            if (objectSummary.getKey().equals(key))
            {
                return true;
            }

        }
        return false;
    }
 3
Author: kkunal, 2015-12-24 05:35:47

Divisez votre chemin en seau et objet. Test du compartiment à l'aide de la méthode doesBucketExist, Tester l'objet en utilisant la taille de la liste (0 au cas où il n'existerait pas). Donc, ce code fera:

String bucket = ...;
String objectInBucket = ...;
AmazonS3 s3 = new AmazonS3Client(...);
return s3.doesBucketExist(bucket) 
       && !s3.listObjects(bucket, objectInBucket).getObjectSummaries().isEmpty();
 2
Author: roee, 2015-12-17 20:01:34

Il existe un moyen facile de le faire en utilisant la méthode isObjectInBucket() de l'API jetS3t.

Exemple de code:

ProviderCredentials awsCredentials = new AWSCredentials(
                awsaccessKey,
                awsSecretAcessKey);

        // REST implementation of S3Service
        RestS3Service restService = new RestS3Service(awsCredentials);

        // check whether file exists in bucket
        if (restService.isObjectInBucket(bucket, objectKey)) {

            //your logic

        }
 1
Author: Dhwaneel, 2015-05-28 04:14:10

Alternativement, vous pouvez utiliser la bibliothèque client Minio-Java , son Open Source et compatible avec l'API AWS S3.

Vous pouvez utiliser Minio-Java StatObject.java exemples pour le même.

import io.minio.MinioClient;
import io.minio.errors.MinioException;

import java.io.InputStream;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;

import org.xmlpull.v1.XmlPullParserException;


public class GetObject {
  public static void main(String[] args)
    throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException, MinioException {
    // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are
    // dummy values, please replace them with original values.
    // Set s3 endpoint, region is calculated automatically
    MinioClient s3Client = new MinioClient("https://s3.amazonaws.com", "YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY");
    InputStream stream = s3Client.getObject("my-bucketname", "my-objectname");

    byte[] buf = new byte[16384];
    int bytesRead;
    while ((bytesRead = stream.read(buf, 0, buf.length)) >= 0) {
      System.out.println(new String(buf, 0, bytesRead));
    }

    stream.close();
  }
}

J'espère que ça aide.

Avertissement : je travaille pour Minio

 0
Author: koolhead17, 2016-05-13 14:39:09

Utilisez la méthode doesBucketExist de S3Client dans AWS SDK

  static final AmazonS3 S3_CLIENT = AmazonS3ClientBuilder.defaultClient();
    if (!S3_CLIENT.doesBucketExist(bucketName)) {
            CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName, region);
            Bucket bucket = S3_CLIENT.createBucket(createBucketRequest);

            logger.log("Created Bucket Name" + bucket.getName() + " | Creation :" + bucket.getCreationDate());
        }

J'espère que ça aide.

 0
Author: Anant Goswami, 2017-12-29 06:54:18