在我们的项目中,我们将对象存储在启用了版本控制的S3存储桶中。除了为客户端创建签名URI之外,服务器上没有逻辑。我们希望保持这种方式,因为我们希望客户端进行所有处理。
解决问题。我们已成功为整个对象生成GET和PUT对象的签名URI,但我们无法生成用于列出所有可用版本的URI。
这是我们的一个桶中的对象上的GET-url的一个例子(99/2是桶中的文件夹): https://bucketname.s3.amazonaws.com/99/2?AWSAccessKeyId=ourkey&Signature=signature&Expires=1410784420
根据文档(GET versions),我们应该追加?版本和不同的版本。我们尝试过以下方法: https://bucketname.s3.amazonaws.com/99/2?AWSAccessKeyId=ourkey&Signature=signature&Expires=1410784420&versions
这导致浏览器抱怨签名错误,它缺少“?版本”。如果我阅读docs我会解释它,因为它不应该包含在签名中,除非我们也附加一个值,我们不是。问题是,如果我将它添加到签名创建中并不重要,因为它仍然失败,并显示错误“没有关键字的”版本子资源“。
是否有人成功创建了对象的签名uri以列出其版本?我们真的很想知道我们做错了什么! 我还想指出,我们没有使用内置的URI生成器,因为我们无法满足我们的需求。
答案 0 :(得分:0)
列出对象版本是执行的操作"针对"桶,而不是对象...所以无论你想要列出什么键,你的路径总是/
。
您可以将查询字符串中的键前缀指定为prefix=...
。
然后,要签名的字符串将以/bucketname/?versions&prefix=...
开头。
您可以排序所有查询字符串参数,除之外的子资源(在本例中为versions
),这是第一个。如果有多个子资源,你也可以在它们之间进行词汇排序,但它们仍然是第一位的。所有内容都由字符串中的&
分隔开来。
重要警告:列表api可能不适合移交给客户端,因为您最终可能会返回错误的内容..."前缀"只是 - 一个前缀。如果它没有完全匹配,它可以匹配子串,这可能不是你想要的。您可能还需要使用delimiter
和max-keys
,并准备通过截断的列表处理分页,这将在返回大量结果时成为必要。
http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETVersion.html
http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html