2012-03-30 14 views
7

Estoy tratando de determinar si existe una carpeta en mi Amazon S3 Bucket y, en caso de que no quiera, quiero crearla.Amazon S3 Creación de carpetas a través de SDK .NET a través de Management Console

En el momento en que puedo crear la carpeta utilizando el SDK .NET de la siguiente manera:

 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); 

    } 

Ahora cuando intento para ver si existe la carpeta que utiliza este código:

 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; 
     } 
    } 

No puede encuentra la carpeta. Lo extraño es que si creo la carpeta usando AWS Management Console, el método 'DoesFolderExist' puede verla.

No estoy seguro de si es una cuestión de ACL/IAM, pero no estoy seguro de cómo resolver esto.

Respuesta

10

Tu código funciona realmente para mí, pero hay algunas cosas que debes tener en cuenta.

Según tengo entendido, Amazon S3 no tiene un concepto de carpetas, pero los clientes individuales pueden mostrar los objetos S3 como si lo hicieran. Entonces, si crea un objeto llamado A/B, entonces el cliente puede mostrarlo como si fuera un objeto llamado B dentro de una carpeta llamada A. Esto es intuitivo y parece haberse convertido en un estándar, pero la simulación de una carpeta vacía no aparece tener un estándar.

Por ejemplo, utilicé su método para crear una carpeta llamada Test, y en realidad terminé creando un objeto llamado Test /. Pero creé una carpeta llamada Test2 en AWS Explorer (es decir, el complemento a Visual Studio) y terminó creando un objeto llamado Test2/Test2_ $ folder $ (AWS Explorer mostrará tanto Test como Test2 como carpetas)

Once de las cosas que esto significa es que no necesita para crear la 'carpeta' antes de poder usarla, lo que puede significar que no necesita un método DoesFolderExist.

Como menciono Probé su código y funciona y se encuentra la carpeta de prueba que creó, pero la clave tenía que ser ajustado para encontrar la carpeta creada por AWS Explorer, es decir

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

Así que si lo hace todavía desea tener un método DoesFolderExist, entonces podría ser más seguro que sólo tiene que buscar los objetos que comienzan con nomCarpeta + "/", es decir, algo como

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

información útil - gracias –

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

ruta puede ser algo así como "imágenes/40/". Usando el código anterior puede verificar si existe o no la denominada carpeta "images/40 /" en el depósito.

Pero el modelo de datos de Amazon S3 no tiene el concepto de carpetas. Cuando intente copiar una imagen o archivo en determinada ruta, si esta carpeta compartida no existe, se creará automáticamente como parte del nombre clave de este archivo o imagen. Por lo tanto, en realidad no necesita verificar si esta carpeta existe o no.

Información muy importante de docs.aws.amazon.com: El modelo de datos de Amazon S3 es una estructura plana: se crea una cubeta y la cubeta almacena objetos. No hay jerarquía de subcarpetas o subcarpetas; sin embargo, puede inferir una jerarquía lógica usando prefijos y delimitadores de nombre de clave como lo hace la consola de Amazon S3.

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

Cuestiones relacionadas