Amazon S3通过.NET SDK与管理控制台创建文件夹

Web*_*ere 8 .net c# amazon-s3 amazon-web-services

我正在尝试确定我的Amazon S3 Bucket上是否存在文件夹,如果不存在,我想创建它.

目前我可以使用.NET SDK创建文件夹,如下所示:

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

    }
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试使用此代码查看文件夹是否存在时:

        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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

它找不到该文件夹​​.奇怪的是,如果我使用AWS管理控制台创建文件夹,'DoesFolderExist'方法可以看到它.

我不确定它是否是ACL/IAM,但我不确定如何解决这个问题.

sgm*_*ore 12

您的代码实际上适合我,但有一些事情需要注意.

据我了解,Amazon S3没有文件夹的概念,但是个别客户端可能会像显示S3对象一样显示它们.因此,如果您创建一个名为A/B的对象,那么客户端可能会将其显示为在名为A的文件夹中的名为B的对象.这是直观的,似乎已成为标准,但模拟空文件夹不会出现有标准.

例如,我使用您的方法创建一个名为Test的文件夹,然后实际上最终创建一个名为Test /的对象.但是我在AWS Explorer中创建了一个名为Test2的文件夹(即Visual Studio的插件),最后创建了一个名为Test2/Test2_ $ folder $的对象(AWS Explorer将Test和Test2都显示为文件夹)

这意味着,在您使用它之前,您不需要创建"文件夹",这可能意味着您不需要使用DoesFolderExist方法.

正如我所提到的,我尝试了你的代码并且它可以工作并找到它创建的Test文件夹,但是必须调整密钥才能找到AWS Explorer创建的文件夹,即

DoesFolderExist("Test/"               , bucketName);  // Returns true
DoesFolderExist("Test2/"              , bucketName);  // Returns false
DoesFolderExist("Test2/Test2_$folder$", bucketName);  // Returns true
Run Code Online (Sandbox Code Playgroud)

因此,如果您仍然想要一个DoesFolderExist方法,那么只查找以folderName +"/"开头的任何对象可能更安全,即类似

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);
}
Run Code Online (Sandbox Code Playgroud)