3

我们正在尝试使用 aws S3 来存储文件。我们在 JAVA 中创建了一个简单的 REST API 来上传和检索文件。

请求更新文件的客户端使用我们的 REST API,它提供了一个预签名的 url 来 PUT/GET 文件。我们正在使用 AWS SDK for java 来生成预签名的 url。

在 S3 上更新文件时,我们需要向文件添加一些自定义元数据。由于我们不控制上传到 S3 本身,有没有办法可以在生成预签名 URL 时添加这些信息?让客户将此信息作为其请求标头的一部分提供是不好的。

4

1 回答 1

8

我们今天偶然发现了同样的问题并试图使用

// does not work
request.putCustomRequestHeader(Headers.S3_USER_METADATA_PREFIX + "foo", "bar");

不幸的是,这并没有真正起作用,它添加了元数据,但预签名 url 的调用者仍然必须使用请求标头提供元数据,这是客户端不应该做的事情。

最后我们发现 usingGeneratePresignedUrlRequest#addRequestParameter可以很好地完成这项工作:

GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest("bucket", "yourFile.ending");
request.addRequestParameter(Headers.S3_USER_METADATA_PREFIX + "foo", "bar"); 
// import com.amazonaws.services.s3.Headers; needed

预签名的 url 然后看起来像

https://bucket.s3.region.amazonaws.com/yourFile.ending?x-amz-meta-foo=bar&X-Amz-Security-Token=...

元数据可以在 url 中清楚地看到,使用 Postman 到PUT该文件upload-file在正文中使用在存储桶中创建具有正确元数据的文件,并且客户端无法更改元数据,因为这会使签名不再匹配请求。

唯一不那么漂亮的部分是必须为用户元数据指定内部 aws 标头前缀。

于 2017-08-29T15:36:26.090 回答