Heim > Artikel > Backend-Entwicklung > Wie lade ich ein Objekt von AWS S3 in den Speicher herunter und sende es per Anfrage in Go?
Kann mir jemand helfen, diesen Fehler zu beheben, der beim Herunterladen einer Datei von s3 angezeigt wird?
Ich möchte also über Go Gin eine Speicherdienst-API erstellen und eine Route, die einen S3-Objektschlüssel verwendet, um ein Objekt herunterzuladen und dieses Objekt dann an den Client zurückzusenden.
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()) })
Der obige Code gibt mir diesen Fehler:
Operationsfehler s3: getobject, https-Antwortfehlerstatuscode: 403, Anforderungs-ID: 8khyw3rcs2za7d95, Host-ID: kolo+gy/dtzrrovswsb1bxinln8w+xdl0lnmysuwjnhupmbvk4itdfp+mq2xuo8ehasnx/fai4i=, API-Fehler accessdenied: Zugriff verweigert phpcnendc. phpcn
Der Anfragetext sieht so aus:
{ "filekey": "https://xxx-xxx.s3.ap-southeast-1.amazonaws.com/agencies/photo/06%3A03%3A2023_17%3A42%3A42_gggi_db_er.png" }
Ich habe alle diese aws_s3_bucket_name, aws_region, aws_access_key_id, aws_secret_access_key in .env-Dateien gespeichert, und ich denke, ich habe sie richtig eingestellt, weil ich eine andere Route habe, die Dateien nach s3 hochlädt (was großartig funktioniert).
Ihr Dateischlüssel ist diese URL:
"https://xxx-xxx.s3.ap-southeast-1.amazonaws.com/agencies/photo/06%3A03%3A2023_17%3A42%3A42_gggi_db_er.png"
Dies kann nur von einem http-Client aus verwendet werden, z. B. einem Webbrowser oder Curl.
Konkret handelt es sich nicht um einen gültigen S3-Objektschlüssel. Bei Verwendung von getobject oder einer ähnlichen S3-API muss es sich um einen gültigen Schlüssel wie agcies/photo/xyz.png
agcies/photo/xyz.png handeln und darf nicht URL-codiert sein.
Das obige ist der detaillierte Inhalt vonWie lade ich ein Objekt von AWS S3 in den Speicher herunter und sende es per Anfrage in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!