如何从AWS S3下载对象到内存中,并在Go语言中通过请求发送?

dgtucam1  于 2023-03-10  发布在  Go
关注(0)|答案(1)|浏览(190)

有人能帮我解决这个错误,我得到了,而试图从S3下载文件。
因此,我想通过Go Gin创建存储服务API,并且我想使用S3对象密钥下载对象,然后将此对象发送回客户端。

cfg,_ := config.LoadDefaultConfig(context.TODO())

// Create an Amazon S3 service client
s3Client := s3.NewFromConfig(cfg)
downloader := manager.NewDownloader(s3Client)
router.POST("/download-s3", func(ctx *gin.Context) {
        var data map[string]string

        if err := ctx.ShouldBindJSON(&data); err != nil {
            log.Println("Error: bind error")
            ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            return
        }

        log.Println("Body Request data (fileKey): ", data["fileKey"])

        fileKey := data["fileKey"]

        /// Buffer read
        buf := make([]byte, 100)
        // wrap with aws.WriteAtBuffer
        w := manager.NewWriteAtBuffer(buf)
        // download file into the memory
        numBytesDownloaded, err := downloader.Download(ctx, w, &s3.GetObjectInput{
            Bucket: aws.String(bucketName),
            Key:    aws.String(fileKey),
        })
        if err != nil {
            log.Println("Error: download error")
            ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            return
        }

        ctx.JSON(http.StatusAccepted,
            gin.H{
                "message":            fmt.Sprintf("'%s' downloaded!", "test.jpg"),
                "numBytesDownloaded": numBytesDownloaded,
            },
        )

        ctx.Data(http.StatusOK, "application/octet-stream", w.Bytes())

    })

上面的代码给我这个错误:operation error S3: GetObject, https response error StatusCode: 403, RequestID: 8KHYW3RCS2ZA7D95, HostID: kOLo+gY/dTzrROVswsB1bxinlN8w+XDL0LNMySUWJNHUPMBVk4ItdfP+mQ2xuo8ehaSnX/FaI4I=, api error AccessDenied: Access Denied
请求主体如下所示:

{
    "filekey": "https://xxx-xxx.s3.ap-southeast-1.amazonaws.com/agencies/photo/06%3A03%3A2023_17%3A42%3A42_gggi_db_er.png"
}

我得到了所有这些AWS_S3_BUCKET_NAME,AWS_REGION,AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY存储在.env文件中,加上我认为我设置了他们的权利,因为我得到了另一个路径上传文件到S3(这工作得很好)。

jtoj6r0c

jtoj6r0c1#

您的fileKey是一个如下所示的URL:

"https://xxx-xxx.s3.ap-southeast-1.amazonaws.com/agencies/photo/06%3A03%3A2023_17%3A42%3A42_gggi_db_er.png"

它只能从HTTP客户端(如Web浏览器或curl)使用。
具体来说,它不是有效的S3对象键。使用GetObject或类似的S3 API时,它需要是有效的键,如agencies/photo/xyz.png,并且不应进行URL编码。

相关问题