我正在尝试生成一个预签名的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()
返回一个空的地图。
还尝试了generatePresignedUrlRequest.putCustomRequestHeader(key, value)
但是我看到在生成的url字符串中没有发送标头值。
注意:我正在将Amazons3.generatePresignedUrl(generatePresignedUrlRequest).toString();
发送到UI
任何帮助将不胜感激。 附加说明:我正在尝试在不是HTTPS的本地嘲笑S3服务器中执行此操作
答案 0 :(得分:0)
我认为您在混淆请求参数和请求标头。
addRequestParameter
将请求参数添加到已签名的URL。
S3的PUT操作希望请求标头添加元数据(https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html)
您需要改用putCustomRequestHeader
。
请注意,除了使用这些参数签名外,客户端还 实际发送的请求将必须传递与实际相同的值 标头。换句话说,URL生成器代码和客户端代码都需要 知道正在发送的标头。