我们正在尝试使用亚马逊网络服务S3来存储文件。我们用JAVA创建了一个简单的REST API来上传和检索文件。
请求更新文件的客户端使用我们的REST API,它提供了一个预先签名的url来上传/获取文件。我们使用AWS SDK for java来生成预签名的urls。
当文件在S3上更新时,我们需要向文件中添加一些自定义元数据。由于我们无法控制上传到S3本身,有没有一种方法可以在生成预签名url的同时添加此信息?让客户端将此信息作为其请求标头的一部分提供是不好的。
发布于 2017-08-29 23:36:26
我们今天碰巧遇到了同样的问题,并试图使用
// 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
然后,预签名的url如下所示:
https://bucket.s3.region.amazonaws.com/yourFile.ending?x-amz-meta-foo=bar&X-Amz-Security-Token=...
可以在url中清楚地看到元数据,在主体中使用upload-file
使用Postman来PUT
到该文件,从而在桶中创建具有正确元数据的文件,并且客户端不可能改变元数据,因为这将使签名不再与请求匹配。
唯一不太好的地方是必须为用户元数据指定内部aws头前缀。
https://stackoverflow.com/questions/37614286
复制相似问题