【问题标题】:amazon s3 bucket returns only "top level" keysamazon s3 存储桶仅返回“顶级”键
【发布时间】:2015-06-02 02:51:14
【问题描述】:

我面临一个问题,AWSSDKs ListObjects 仅返回“顶级文件夹”的键(我知道存储桶中没有文件夹之类的东西)。 在我的存储桶中,我以不同的分辨率存储图像。存储桶中的“文件夹结构”如下所示:

年/月/分辨率/此分辨率中的文件 (上传时的图片)

如果要更新原始图像,则应删除所有较小分辨率的图像。因此,我想获取存储桶中所有图像的出现。我使用以下代码 sn-p 来执行此操作,并且对于顶级键它可以正常工作。

using (IAmazonS3 amazonS3Client =     Amazon.AWSClientFactory.CreateAmazonS3Client(AWSAccessKey, AWSSecretKey, Amazon.RegionEndpoint.EUWest1))
{
    ListObjectsRequest S3ListObjectRequest = new ListObjectsRequest();
    S3ListObjectRequest.BucketName = "my_bucket";
    S3ListObjectRequest.Delimiter = "LL.jpg";

    ListObjectsResponse listObjectRequest = amazonS3Client.ListObjects(S3ListObjectRequest);

    foreach (string S3BucketDir in listObjectRequest.CommonPrefixes)
    {
        //delete image
    }
}

对于 LL.jpg,我得到以下 CommonPrefixes:

 - 2014/07/T120x120/LL.jpg
 - 2014/07/T160x160/LL.jpg
 - 2014/07/T320x320/LL.jpg
 - 2014/07/T640x640/LL.jpg
 - 2014/07/T76x76/LL.jpg
 - 2014/07/T80x80/LL.jpg

但是对于 orp.jpg 我应该得到:

 - 2015/05/T120x120/orp.jpg
 - 2015/05/T160x160/orp.jpg
 - 2015/05/T640x640/orp.jpg

但是每次都是空的。

如果我设置前缀

S3ListObjectRequest.Prefix = "2015/05";

返回 3 个 CommonPrefixes。 (如果我只使用 '2015' 作为前缀,它也是空的,因为 ListObjects 只在 2015/01 搜索)

感谢您的帮助。

【问题讨论】:

    标签: amazon-web-services amazon-s3


    【解决方案1】:

    我找到了解决这个问题的方法(最好是变通方法)。然而,它令人难以置信的缓慢,但它现在解决了这个问题。仍然希望有更好/更快的解决方案。

    我创建了我的存储桶的所有可能前缀的列表,并检查每个前缀和文件名作为图像出现的分隔符。

            using (IAmazonS3 amazonS3Client = Amazon.AWSClientFactory.CreateAmazonS3Client(AWSAccessKey, AWSSecretKey, Amazon.RegionEndpoint.EUWest1))
            {
                ListObjectsRequest S3ListObjectRequest = new ListObjectsRequest();
                S3ListObjectRequest.BucketName = "my.bucket";
                S3ListObjectRequest.Delimiter = "/";
    
                bool doIt = true;
                IList<string> prefixes = new List<string>();
                IList<string> toCheck = new List<string>();
    
                do
                {
                    ListObjectsResponse response = amazonS3Client.ListObjects(S3ListObjectRequest);
    
                    foreach (string prefix in response.CommonPrefixes)
                        toCheck.Add(prefix);
    
                    if (toCheck.Count > 0)
                    {
                        prefixes.Add(toCheck[0]);
                        S3ListObjectRequest.Prefix = toCheck[0];
                        toCheck.RemoveAt(0);
                    }
                    else
                        doIt = false;
    
                } while (doIt);
    
                foreach (string key in prefixes)
                {
                    S3ListObjectRequest.Prefix = key;
                    S3ListObjectRequest.Delimiter = "filename.jpg";
                    ListObjectsResponse response = amazonS3Client.ListObjects(S3ListObjectRequest);
    
                    foreach (string image in response.CommonPrefixes)
                    {
                        //path of images to delete
                        Console.WriteLine(image);
                    }
                }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-28
      • 2016-08-25
      • 1970-01-01
      • 2014-09-04
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 2023-02-26
      相关资源
      最近更新 更多