web-dev-qa-db-fra.com

Déterminer si un objet existe dans un compartiment S3 en fonction d'un caractère générique

Quelqu'un peut-il me montrer comment déterminer si un certain fichier/objet existe dans un compartiment S3 et afficher un message, le cas échéant ou non.

En gros, je le veux:

1) Vérifier un compartiment sur mon compte S3 tel que testbucket

2) À l'intérieur de ce compartiment, vérifiez s'il existe un fichier avec le préfixe test_ (test_file.txt ou test_data.txt).

3) Si ce fichier existe, affichez un MessageBox (ou un message de la console) indiquant que le fichier existe ou qu'il n'existe pas.

Quelqu'un peut-il s'il vous plaît me montrer comment faire cela?

30
fraXis

Utilisation de AWSSDK pour .Net I Effectuez actuellement les tâches suivantes:

public bool Exists(string fileKey, string bucketName)
{
        try
        {
            response = _s3Client.GetObjectMetadata(new GetObjectMetadataRequest()
               .WithBucketName(bucketName)
               .WithKey(key));

            return true;
        }

        catch (Amazon.S3.AmazonS3Exception ex)
        {
            if (ex.StatusCode == System.Net.HttpStatusCode.NotFound)
                return false;

            //status wasn't not found, so throw the exception
            throw;
        }
}

C'est un peu nul, mais ça marche pour le moment.

44
Alex

Utilisez la méthode S3FileInfo.Exists

using (var client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKey, secretKey))
{
    S3FileInfo s3FileInfo = new Amazon.S3.IO.S3FileInfo(client, "your-bucket-name", "your-file-name");
    if (s3FileInfo.Exists)
    {
         // file exists
    }
    else
    {
        // file does not exist
    }   
}
54
Pradeep

Cela résout le problème: 

Lister le compartiment pour les objets existants et utiliser un préfixe comme ceci.

    var request = new ListObjectsRequest()
        .WithBucketName(_bucketName)
        .WithPrefix(keyPrefix);

    var response = _amazonS3Client.ListObjects(request);

    var exists = response.S3Objects.Count > 0;

    foreach (var obj in response.S3Objects) {
        // act
    }
12
Alvis

Je sais que cette question date de quelques années, mais le nouveau SDK le gère magnifiquement. Si quelqu'un cherche toujours cela. Vous recherchez S3DirectoryInfo Class 

using (IAmazonS3 s3Client = new AmazonS3Client(accessKey, secretKey))
{
    S3DirectoryInfo s3DirectoryInfo = new Amazon.S3.IO.S3DirectoryInfo(s3Client, "testbucket");
    if (s3DirectoryInfo.GetFiles("test*").Any())
    {
        //file exists -- do something
    }
    else
    {
        //file doesn't exist -- do something else
    }
}
10
Robbie Chiha

J'ai utilisé le code suivant en C # avec Amazon S3 version 3.1.5 (.net 3.5) pour vérifier si le compartiment existe:

BasicAWSCredentials credentials = new BasicAWSCredentials("accessKey", "secretKey");

AmazonS3Config configurationAmazon = new AmazonS3Config();
configurationAmazon.RegionEndpoint = S3Region.EU; // or you can use ServiceUrl

AmazonS3Client s3Client = new AmazonS3Client(credentials, configurationAmazon);


S3DirectoryInfo directoryInfo = new S3DirectoryInfo(s3Client, bucketName);
            bucketExists = directoryInfo.Exists;// true if the bucket exists in other case false.

J'ai utilisé le code suivant (en C # avec Amazon S3 version 3.1.5 .net 3.5) le fichier existe.

Option 1:

S3FileInfo info = new S3FileInfo(s3Client, "butcketName", "key");
bool fileExists = info.Exists; // true if the key Exists in other case false

Option 2:

ListObjectsRequest request = new ListObjectsRequest();
        try
        {
            request.BucketName = "bucketName";
            request.Prefix = "prefix"; // or part of the key
            request.MaxKeys = 1; // max limit to find objects
            ListObjectsResponse response = s3Client .ListObjects(request);
            return response.S3Objects.Count > 0;
        }

Je ne suis pas familier avec C #, mais j'utilise cette méthode depuis Java (la conversion en c # est immédiate):

public boolean exists(AmazonS3 s3, String bucket, String key) {
    ObjectListing list = s3.listObjects(bucket, key);
    return list.getObjectSummaries().size() > 0;
}
1
Monkiki

essaye celui-là:

    NameValueCollection appConfig = ConfigurationManager.AppSettings;

        AmazonS3 s3Client = AWSClientFactory.CreateAmazonS3Client(
                appConfig["AWSAccessKey"],
                appConfig["AWSSecretKey"],
                Amazon.RegionEndpoint.USEast1
                );

S3DirectoryInfo source = new S3DirectoryInfo(s3Client, "BUCKET_NAME", "Key");
if(source.Exist)
{
   //do ur stuff
}
0
Prasad Shigwan
 s3 = new S3(S3KEY, S3SECRET, false);
 res = s3->getObjectInfo(bucketName, filename);

Il retournera un tableau si le fichier existe

0
Deepika Patel

Je sais que cette question date de quelques années, mais le nouveau SDK le gère maintenant de manière plus simple.

  public async Task<bool> ObjectExistsAsync(string prefix)
  {
     var response = await _amazonS3.GetAllObjectKeysAsync(_awsS3Configuration.BucketName, prefix, null);
     return response.Count > 0;
  }

_amazonS3 est votre instance IAmazonS3 et _awsS3Configuration.BucketName est votre nom de compartiment.

Vous pouvez utiliser votre clé complète comme préfixe.

0
Razvan Dumitru