当前位置: 首页 > 知识库问答 >
问题:

在GO中使用AWS SDK V2上传图像失败

栾烨华
2023-03-14

我正在使用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.
[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)
}


共有1个答案

乐华晖
2023-03-14

在花了几天时间之后,我了解到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/"
 类似资料:
  • 我正在关注马丁·拉塞克的教程,现在我正在“图片上传”。似乎没有人能回答“如何上传图片i Vapor 3”这个问题 db连接正常,所有其他值都被保存。 这是mye创建方法: 和型号: } 和叶模板: 我知道需要一种管理文件的方法,原始图像字节, 但是我怎么去那里呢?

  • 问题内容: 我建立了一个可以摄取图像的模型,可以读取像素级别的图像,然后确定图像中包含猫还是狗。出于教育目的,我现在尝试将其放入Flask应用程序中(以前从未使用过Flask)。到目前为止,我的工作:用户上传图像,Flask将图像保存到磁盘,图像被操纵并发送到模型,模型预测,然后从模板生成输出页面。现在,我想显示用户上传的图像,但是遇到了问题。适用的代码在这里: 和模板: 我要返回的是“预测:ya

  • 我正试图用Alamofire将图像上传到服务器,但我的代码不起作用。这是我的代码: 这是urlRequestWithComponents方法: 这就是我在控制台得到的: 请求{URL:http://tranthanhphongcntt.esy.es/task_manager/IOSFileUpload/ }响应可选({URL:http://tranthanhphongcntt.esy.es/tas

  • 经过一些研究,我发现了一个用于多部分文件上传的开放库。在我的情况下,我想上传一个图像使用PUT请求,其中的图像要么是从画廊或相机选择。以下是我正在使用的资源:1。https://github.com/gotev/android-upload-service2.https://www.simplifiedcoding.net/android-upload-image-to-server/#comme

  • 问题内容: 我正在尝试使用jQuery和Ajax函数上传图像,以及如何获取图像文件的所有详细信息,例如我们使用的php 这是我的代码 JS 控制者 视图 响应 C:\ fakepath \ Koala.jpg您没有选择要上传的文件。 请帮忙 问题答案: 您可以在html5中使用FormData API。 您的表格必须是: 然后jQuery: 然后,在控制器中,您将获得数组中的文件。

  • 我正在使用翻新上传图像/文件 在这里,我发布了我的API调用以上传图像 请帮助我如何为这个调用编写接口,我已经用@part和@PartMap试过了,但是不起作用