我们正在尝试使用aws S3来存储文件。我们在JAVA中创建了一个简单的REST API来上传和检索文件。
请求更新文件的客户端使用我们的REST API,它们为PUT / GET文件提供预先指定的URL。我们正在使用AWS SDK for java生成预先签名的网址。
我们需要在S3上更新文件时为文件添加一些自定义元数据。由于我们不控制上传到S3本身,我们是否可以在生成预签名网址时添加此信息?让客户端将这些信息作为其请求标头的一部分提供是不好的。
答案 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头文件前缀。