AWS S3使用预签名URL添加/设置/更新/指定用户元数据

时间:2016-06-03 12:21:45

标签: java amazon-s3 metadata aws-sdk pre-signed-url

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

请求更新文件的客户端使用我们的REST API,它们为PUT / GET文件提供预先指定的URL。我们正在使用AWS SDK for java生成预先签名的网址。

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

预先签名的网址看起来像

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

可以在网址中清楚地看到元数据,使用邮递员PUT使用upload-file使用{{1}}在正文中创建包含正确元数据的文件。

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