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 pas de méthodes utiles. J’ai essayé d’utiliser getObject mais il a getObject une exception.

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 permettra de vérifier et de récupérer uniquement les détails de l’object (pas le contenu) de l’object. Il jettera un 404 si l’object est manquant. Vous pouvez donc capturer cette exception et la gérer dans votre application.

Mais pour que cela fonctionne, vous devez avoir un access ListBucket pour l’utilisateur sur ce compartiment. L’access à 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 access à ListBucket. Le simple fait de savoir si une clé est présente ou non suffit pour certains utilisateurs malveillants. Par conséquent, à moins d’avoir access à ListBucket, ils ne pourront pas le faire.

Il y a maintenant une méthode doesObjectExist dans l’API Java officielle.

Prendre plaisir!

Utilisez errorCode.equals("NoSuchKey")

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

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

L’utilisation du kit AWS SDK utilise la méthode getObjectMetadata. La méthode lancera une exception AmazonServiceException si la clé n’existe pas.

 private AmazonS3 s3; ... public boolean exists(Ssortingng path, Ssortingng name) { try { s3.getObjectMetadata(bucket, getS3Path(path) + name); } catch(AmazonServiceException e) { return false; } return true; } 

Dans Amazon Java SDK 1.10+, vous pouvez utiliser getStatusCode() pour obtenir le code d’état de la réponse HTTP, qui sera 404 si l’object 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() consum moins de ressources et la réponse n’a pas besoin d’être fermée 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).

Utilisez le paramètre ListObjectsRequest Prefix comme clé.

Code .NET:

  public bool Exists(ssortingng 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; } } }. 

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

 $bucket = "MyBucket"; $key = "MyKey"; $s3 = Aws\S3\S3Client->factory([...]); $s3->registerStreamWrapper(); $keyExists = file_exists("s3://$bucket/$key"); 

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

 public static boolean isExistS3(Ssortingng accessKey, Ssortingng secretKey, Ssortingng bucketName, Ssortingng 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; } 

Utiliser Object isting. Fonction Java pour vérifier si une clé spécifiée existe dans AWS S3.

 boolean isExist(Ssortingng 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; } 

Brisez votre chemin dans le seau et l’object. Test du doesBucketExist à l’aide de la méthode doesBucketExist , Test de l’object en utilisant la taille de la liste (0 au cas où il n’en existe pas). Donc ce code fera:

 Ssortingng bucket = ...; Ssortingng objectInBucket = ...; AmazonS3 s3 = new AmazonS3Client(...); return s3.doesBucketExist(bucket) && !s3.listObjects(bucket, objectInBucket).getObjectSummaries().isEmpty(); 

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 } 

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

Vous pouvez utiliser les exemples Minio-Java StatObject.java pour la même chose.

 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;


 classe publique GetObject {
   main statique vide statique (Ssortingng [] args)
     lève NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException, MinioException {
     // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY et my-bucketname sont
     // valeurs factices, veuillez les remplacer par des valeurs originales.
     // Définir le noeud final s3, la région est calculée automatiquement
     MinioClient s3Client = new MinioClient ("https://s3.amazonaws.com", "YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY");
     Flux StreamStream = s3Client.getObject ("my-bucketname", "my-objectname");

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

     stream.close ();
   }
 }

J’espère que ça aide.

Disclaimer: Je travaille pour Minio

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()); }
 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 cela aide.