java - AWS S3 预签名 URL 到带有附加用户参数的 PUT 对象不起作用

标签 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()

返回一个空 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/

相关文章:

java - 如何从字符串或 json 对象中搜索并打印特定内容

java - JSP include,前后导入代码

java - Akka/futures——Akka 是否使用当前线程或调度程序来决定它是 "worth"?

java - ListAdapter 在 ListView 中只添加一种类型的数据

amazon-web-services - AWS SAM - 通过 SAM 模板在 API 网关方法中强制执行请求验证

ruby-on-rails - Amazon S3,如何处理从上传到对象可用性的延迟

ios - 基于 Cognito ID 的 S3 文件夹访问的 IAM 策略

node.js - aws - 将字符串作为文件上传到 S3 存储桶

amazon-web-services - AWS Rekognition 给出了 InvalidS3Exeption 错误

bash - 如何在用户数据bash代码中获取CloudFormation资源值