如何从Amazon S3 Bucket获取最旧的添加对象?

时间:2013-04-15 13:53:23

标签: c# amazon-web-services amazon-s3 storage

我在亚马逊水桶中有一个文件夹,里面有一些物品。

如何获取最早添加的对象?

 public FileMetaData Poll()
        {
            var config = new AmazonS3Config();
            config.ServiceURL = "s3.amazonaws.com";
            config.CommunicationProtocol = Protocol.HTTP;

            string bucketName = "bucketname1";
            string accessKey = "accesskey1";
            string secretKey = "secretkey1";

            Amazon.S3.AmazonS3 client = AWSClientFactory.CreateAmazonS3Client(accessKey,
                secretKey,
                config);

            var request = new GetObjectRequest();
            request.WithBucketName(bucketName);

            // how to get the oldest object?

            GetObjectResponse response = client.GetObject(request);

            // todo
            return null;
        }

我已经尝试了下面的代码,它运行正常,但问题是它加载所有对象然后找到最老的,我认为这是一个糟糕的做法:

var request = new ListObjectsRequest()
                .WithBucketName(bucketName)
                .WithPrefix(this._folderPath);

            ListObjectsResponse response = client.ListObjects(request);

            S3Object s3Object = response.S3Objects
                .Where(p => !p.Key.EndsWith("_$folder$"))
                .OrderBy(k => k.LastModified).FirstOrDefault();

            var getObjectRequest = new GetObjectRequest()
                .WithBucketName(bucketName)
                .WithKey(s3Object.Key);

            GetObjectResponse getObjectResponse = client.GetObject(getObjectRequest);

            // provider 
            string provider = getObjectResponse.Metadata.Get("x-amz-meta-provider");
            string site = getObjectResponse.Metadata.Get("x-amz-meta-sitename");
            string identifier = s3Object.Key.Remove(0, this._folderPath.Length);
            string xmlData = new StreamReader(getObjectResponse.ResponseStream, true).ReadToEnd();

            return new FileMetaData()
                {
                    Identifier = identifier,
                    Provider = provider,
                    SiteName = site,
                    XmlData = xmlData
                };

2 个答案:

答案 0 :(得分:1)

您的代码似乎很好。 “列出对象请求”只会丢失几秒钟,但据我所知,这是强制性的。

我看到你的代码遇到的一个问题是你没有处理每个请求返回的最大密钥量为1000的事实。如果你的密钥多于那个,那么你必须检查列表是否被截断,将请求标记更改为下一个请求标记并发出更多请求。

Model

答案 1 :(得分:0)

  

它加载所有对象然后找到最旧的

实际上,你没有加载所有对象,你列出它们(差异很大。)S3不是数据库(而不是文件系统),所以如果你想要你必须建立你自己的本地索引容易接近。 (或使用DynamoDB,SimpleDB,RDS等)

更改密钥以包含日期/时间对很多没有帮助。您可以使用前缀和分隔符来缩小搜索范围。 (即如果每个文件以“YYYY-MM-DD-HHMM”开头,您可以将分隔符设置为“ - ”以查找最早的年份,然后使用prefix =“YYYY-”和分隔符“ - ”来查找最早的月份等。)