【问题标题】:Image upload failed using AWS SDK V2 in GO在 GO 中使用 AWS SDK V2 上传图像失败
【发布时间】:2023-04-09 01:53:01
【问题描述】:

我正在使用 AWS S3 服务上传图片。昨天更新SDK v1到v2,发现上传图片失败,报如下错误:

operation error S3: PutObject, https response error StatusCode: 403, RequestID: XXXXXXXXXXX, HostID: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, api error SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided. Check your key and signing method.

更新: 我在 .aws 文件夹中的 linux 主文件夹中有 aws 凭据,格式如下:

[default]
aws_access_key_id = XXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx

代码如下:

package main

import (
    "context"
    "fmt"
    "io"
    "net/http"

    "github.com/aws/aws-sdk-go-v2/aws"
    awsconfig "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/feature/s3/manager"
    "github.com/aws/aws-sdk-go-v2/service/s3"
)

func main() {
    fileName := "test123.jpg"
    filePath := "/BUCKET_NAME/uploads/aman/2021/6/25/"

    res, err := http.Get("https://images.app.goo.gl/mpQ5nXYXjdUMKGgW7")
    if err != nil || res.StatusCode != 200 {
        // handle errors
    }
    defer res.Body.Close()
    UploadFileInS3Bucket(res.Body, fileName, filePath)
}

func UploadFileInS3Bucket(file io.Reader, fileName, filePath string) {
    cfg, err := awsconfig.LoadDefaultConfig(context.TODO(),
        awsconfig.WithRegion("REGION"),
    )
    client := s3.NewFromConfig(cfg)
    uploader := manager.NewUploader(client)
    uploadResp, err := uploader.Upload(context.TODO(), &s3.PutObjectInput{
        Bucket:      aws.String(filePath),
        Key:         aws.String(fileName),
        Body:        file,
        ContentType: aws.String("image"),
    })
    fmt.Println(uploadResp)
    fmt.Println(err)
}


我没有在我的代码中更改任何凭据/存储桶/区域。但是,如果我使用 SDK v1 运行代码,那么它可以正常工作并且正在上传图像。

SDK v2 出了什么问题?

【问题讨论】:

  • 可以是前导斜线吗? stackoverflow.com/questions/30518899/… 提供完整样本以复制。
  • @DmitryHarnitski 我已经检查过了。前导斜线似乎不是这里的问题。
  • 发布可重现的样本。目前尚不清楚您要向该功能发送什么。 V2 对某些东西可能更严格。
  • @DmitryHarnitski 我在上面添加了一个可重现的示例和有关凭据的详细信息。

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


【解决方案1】:

花了几天时间,我才知道 SDK V2 的 Bucket & Key 字段格式如下:

fileName := "uploads/2021/6/25/test123.jpg"
filePath := "BUCKET_NAME"

基本上,对于这些字段,SDK V1 和 V2 中的行为反之亦然。以上是V2。以下是 V1:

fileName := "test123.jpg"
filePath := "/BUCKET_NAME/uploads/2021/6/25/"

【讨论】:

  • 这实际上是有道理的。您现在发送Bucket = "BUCKET_NAME"。我相信 V1 也会接受这一点。 SDK 现在对不正确的数据不太宽容。该错误消息虽然具有误导性。我理解你的困惑。
  • @DmitryHarnitski 是的,错误信息让我很困惑。它应该是正确的描述。
猜你喜欢
  • 2015-04-18
  • 2021-04-23
  • 1970-01-01
  • 2020-08-17
  • 2013-01-08
  • 2021-12-10
  • 2022-11-23
  • 1970-01-01
  • 2013-09-25
相关资源
最近更新 更多