如何在 Go 中向 AWS S3 预签名 URL 添加标头?

我正在使用预签名 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 预签名上传 url 错误的答案表明我们需要将标头声明为预签名 URL 的一部分。如何为此添加标题声明?为 Amazon S3 存储桶创建预签名 URL 中给出的示例未涵盖此内容。


牛魔王的故事
浏览 144回答 2
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,      },    );};

慕尼黑的夜晚无繁华

如果我没记错的话,您可以像这样添加元数据:  'Bucket': 'bucket',  'Key': 'signed.json',  'Metadata': {    'x-amz-tagging': 'whatever'  },所以它看起来像这样:// Upload generates a new URL where a file can be uploadedfunc (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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go