我正在尝试生成一个预签名的 url,将文件放入 s3 中,并附带一些附加元数据
GeneratePresignedUrlRequest generatePresignedUrlRequest =
new GeneratePresignedUrlRequest(bucket, objectKey)
.withMethod(httpMethod)
.withExpiration(expiration);
if (params != null) {
params.forEach(
(k, v) ->
generatePresignedUrlRequest.addRequestParameter(
Headers.S3_USER_METADATA_PREFIX + k.toLowerCase(), v));
}
其中 params 是 Map<String, String>
但是上传文件后,当我尝试使用
获取对象时AmazonS3.getObjectMetadata(bucketName, key).getUserMetadata()
返回一个空 map 。
也尝试过generatePresignedUrlRequest.putCustomRequestHeader(key, value)
但我看到在生成的 url 字符串中, header 值没有被发送。
注意:我正在发送Amazons3.generatePresignedUrl(generatePresignedUrlRequest).toString();
到用户界面
任何帮助将不胜感激。 附加说明:我试图在我的本地mockS3服务器中执行此操作,该服务器不是HTTPS
最佳答案
我认为您混淆了请求参数和请求 header 。
addRequestParameter
将请求参数添加到签名的 URL。
虽然 S3 的 PUT 操作期望请求 header 添加元数据 ( https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html )
您需要改用putCustomRequestHeader
。
请注意,除了使用这些参数进行签名之外,客户端还 实际发送请求必须传递与实际相同的值 header 。换句话说,URL 生成器代码和客户端代码都需要 了解正在发送的 header 。
关于java - AWS S3 预签名 URL 到带有附加用户参数的 PUT 对象不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54462488/