我遇到的问题是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搜索)
感谢您的帮助。
答案 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);
}
}
}