我们今天偶然发现了同样的问题并试图使用
// 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 标头前缀。