带有其他用户参数的AWS S3预签名URL到PUT对象

时间:2019-01-31 14:14:20

标签: java amazon-web-services amazon-s3 aws-sdk

我正在尝试生成一个预签名的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服务器中执行此操作

1 个答案:

答案 0 :(得分:0)

我认为您在混淆请求参数和请求标头。

addRequestParameter请求参数添加到已签名的URL。

S3的PUT操作希望请求标头添加元数据(https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html

您需要改用putCustomRequestHeader

请注意,除了使用这些参数签名外,客户端还 实际发送的请求将必须传递与实际相同的值 标头。换句话说,URL生成器代码和客户端代码都需要 知道正在发送的标头。