【问题标题】:How can I add a header to an AWS S3 presigned URL in Go?如何在 Go 中向 AWS S3 预签名 URL 添加标头?
【发布时间】:2021-02-10 06:18:00
【问题描述】:

我正在使用预签名 URL 将文件上传到 AWS S3 存储桶。这工作正常,但如果我尝试添加 x-amz-tagging 标头,我会收到错误“请求中存在未签名的标头”。

生成预签名 URL 的后端是用 Go 编写的:

// Upload generates a new URL where a file can be uploaded
func (s *S3) Upload(key string, c Config) (string, error) {
    req, _ := s.client.PutObjectRequest(&s3.PutObjectInput{
        Bucket: aws.String(s.bucketName),
        Key:    aws.String(key),
    })

    return req.Presign(c.ExpiresIn)
}

S3 presigned upload url error 的答案表明我们需要将标头声明为预签名 URL 的一部分。如何为此添加标题声明? Creating Pre-Signed URLs for Amazon S3 Buckets 上给出的示例并未涵盖这一点。

【问题讨论】:

  • 网址没有标题。

标签: go amazon-s3 pre-signed-url aws-sdk-go


【解决方案1】:

如果我没记错的话,你可以像这样添加元数据:

  'Bucket': 'bucket',
  'Key': 'signed.json',
  'Metadata': {
    'x-amz-tagging': 'whatever'
  },

所以它看起来像这样:

// Upload generates a new URL where a file can be uploaded
func (s *S3) Upload(key string, c Config) (string, error) {
    req, _ := s.client.PutObjectRequest(&s3.PutObjectInput{
        Bucket: aws.String(s.bucketName),
        Key:    aws.String(key),
        Body: {
                'x-amz-tagging': 'whatever'
       },
    })

    return req.Presign(c.ExpiresIn)
}

我是即时编写的,因此它可能无法正常工作,需要进行一些调整。请参阅文档 - 但它应该看起来像这样。测试一下,然后告诉我。

在此处阅读更多信息:https://docs.aws.amazon.com/sdk-for-go/api/service/s3/#PutObjectInput

【讨论】:

  • 我查看了该文档,但我认为它会使用“标记”而不是“元数据”。不过,您已经在代码中使用了“Body”。我也不想声明“x-amz-tagging”的值,所以“whatever”可以是“*”吗?
【解决方案2】:

预签名的 URL 请求只需要 Tagging 字段下的标签。当您使用此 URL 发出请求时,即传递带有“x-amz-tagging”作为键和标签的标头(例如,“temp=true&public=yes”)。

以下是使用预签名 url 上传带有标签(通过标题)的图像的示例,该 URL 也被请求带有标签(带有标签)。

  const uploadImage = async (filepath, presignedURL) => {
    const headers = new Headers();
    headers.append('x-amz-tagging', 'temp=true&public=yes');
    const response = await fetch(filepath);
    const blob = await response.blob();
    return await fetch(
      presignedURL,
      {
        method: 'PUT',
        body: blob,
        headers,
      },
    );
};

【讨论】:

  • 这不是在回答我的问题。
  • 我想我操之过急。看起来您只需要在 PutObjectInput 中添加 Tagging 键和 aws.String ,这将为您的请求添加标头。那么我的回答将是上传的下一步(以任何语言)。您引用的链接讨论了在您已经获得请求中的 url 之后附加标头,所以这些是我认为您的意思的标头(但您仍然需要添加)。
猜你喜欢
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-28
  • 2019-01-27
  • 2018-10-20
相关资源
最近更新 更多