亚马逊s3桶仅返回"顶级"按键

时间:2015-05-31 10:04:38

标签: amazon-web-services amazon-s3

我遇到的问题是AWSSDKs ListObjects只返回"顶级文件夹的键#34; (我知道桶里没有像文件夹这样的东西)。 在我的桶中,我以不同的分辨率存储图像。 "文件夹结构"在桶中看起来像:

本分辨率中的

年/月/分辨率/文件 (上传时的图像)

如果应更新原始图像,则应删除较小分辨率的所有图像。因此,我希望在桶中获得所有图像的出现。我使用以下代码片段来执行此操作,对于顶级键,它可以正常工作。

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个CommonPrefix。 (如果我只使用' 2015'作为前缀,它也是空的,因为ListObjects仅在2015/01搜索)

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

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

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