2012-03-30 3 views
7

Ich versuche festzustellen, ob ein Ordner in meinem Amazon S3-Bucket vorhanden ist und ob er nicht erstellt werden soll.Amazon S3 Erstellen von Ordnern über .NET SDK und über die Verwaltungskonsole

Im Moment kann ich den Ordner mit dem .NET SDK erstellen, wie folgt:

 public void CreateFolder(string bucketName, string folderName) 
    { 
     var folderKey = folderName + "/"; //end the folder name with "/" 

     var request = new PutObjectRequest(); 

     request.WithBucketName(bucketName); 

     request.StorageClass = S3StorageClass.Standard; 
     request.ServerSideEncryptionMethod = ServerSideEncryptionMethod.None; 

     //request.CannedACL = S3CannedACL.BucketOwnerFullControl; 

     request.WithKey(folderKey); 

     request.WithContentBody(string.Empty); 

     S3Response response = m_S3Client.PutObject(request); 

    } 

Wenn ich jetzt sehen versuchen, wenn der Ordner mit diesem Code vorhanden ist:

 public bool DoesFolderExist(string key, string bucketName) 
    { 
     try 
     { 
      S3Response response = m_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; 
     } 
    } 

Es kann nicht finde den Ordner. Die seltsame Sache ist, wenn ich den Ordner mit der AWS Management Console erstellen, kann die 'DoesFolderExist' Methode es sehen.

Ich bin mir nicht sicher, ob es eine ACL/IAM-Sache ist, aber ich bin mir nicht sicher, wie ich das lösen soll.

Antwort

10

Ihr Code funktioniert tatsächlich für mich, aber es gibt ein paar Dinge, die Sie beachten müssen.

Wie ich es verstehe, hat Amazon S3 kein Konzept von Ordnern, aber einzelne Clients können die S3-Objekte anzeigen, als ob sie dies taten. Wenn Sie also ein Objekt namens A/B erstellen, zeigt der Client es möglicherweise an, als wäre es ein Objekt namens B in einem Ordner namens A. Das ist intuitiv und scheint ein Standard zu sein, aber die Simulation eines leeren Ordners erscheint nicht einen Standard haben.

Zum Beispiel habe ich Ihre Methode verwendet, um einen Ordner namens Test zu erstellen, und dann am Ende ein Objekt namens Test/zu erstellen. Aber ich habe einen Ordner namens Test2 in AWS Explorer (dh das Addon zu Visual Studio) erstellt und es wurde ein Objekt namens Test2/Test2_ $ Ordner $ (AWS Explorer wird sowohl Test als auch Test2 als Ordner angezeigt)

Einmal Das bedeutet, dass Sie nicht benötigen, um den 'Ordner' zu erstellen, bevor Sie ihn verwenden können, was bedeuten kann, dass Sie keine DoesFolderExist-Methode benötigen.

Wie ich schon erwähnt, habe ich versucht, den Code und es funktioniert und findet den Testordner es erstellt, aber der Schlüssel hatte gezwickt werden, um den Ordner von AWS Explorer, dh

DoesFolderExist("Test/"    , bucketName); // Returns true 
DoesFolderExist("Test2/"    , bucketName); // Returns false 
DoesFolderExist("Test2/Test2_$folder$", bucketName); // Returns true 

So erstellt zu finden, wenn Sie tun noch eine DoesFolderExist Methode haben will, dann könnte es sicherer sein, nur für alle Objekte zu suchen, die mit folder + „/“ beginnen, also so etwas wie

ListObjectsRequest request = new ListObjectsRequest(); 
request.BucketName = bucketName ; 
request.WithPrefix(folderName + "/"); 
request.MaxKeys = 1; 

using (ListObjectsResponse response = m_S3Client.ListObjects(request)) 
{ 
    return (response.S3Objects.Count > 0); 
} 
+0

nützliche info - danke –

0
 ListObjectsRequest findFolderRequest = new ListObjectsRequest(); 
     findFolderRequest.BucketName = bucketName; 
     findFolderRequest.Prefix = path; 
     ListObjectsResponse findFolderResponse = s3Client.ListObjects(findFolderRequest); 
     Boolean folderExists = findFolderResponse.S3Objects.Any(); 

Weg so etwas wie „Bilder sein kann/40/". Mit dem obigen Code kann überprüft werden, ob ein sogenannter Ordner "images/40 /" unter dem Bucket existiert oder nicht.

Aber Amazon S3-Datenmodell hat nicht das Konzept der Ordner. Wenn Sie versuchen, ein Bild oder eine Datei in einen bestimmten Pfad zu kopieren, wird dieser Name automatisch als Teil des Schlüsselnamens der Datei oder des Bilds erstellt, wenn dieser Ordner nicht existiert. Daher müssen Sie nicht überprüfen, ob dieser Ordner existiert oder nicht.

Sehr wichtige Informationen von docs.aws.amazon.com: Das Amazon S3-Datenmodell ist eine flache Struktur: Sie erstellen einen Bucket und der Bucket speichert Objekte. Es gibt keine Hierarchie von Unterbuckets oder Unterordnern. Sie können jedoch logische Hierarchien mithilfe von Präfixen und Trennzeichen für Schlüsselnamen ableiten, wie dies bei der Amazon S3-Konsole der Fall ist.

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html

Verwandte Themen