有人能帮我解决这个错误,我得到了,而试图从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(这工作得很好)。
1条答案
按热度按时间jtoj6r0c1#
您的fileKey是一个如下所示的URL:
它只能从HTTP客户端(如Web浏览器或curl)使用。
具体来说,它不是有效的S3对象键。使用GetObject或类似的S3 API时,它需要是有效的键,如
agencies/photo/xyz.png
,并且不应进行URL编码。