Heim  >  Artikel  >  Backend-Entwicklung  >  Wie lade ich ein Objekt von AWS S3 in den Speicher herunter und sende es per Anfrage in Go?

Wie lade ich ein Objekt von AWS S3 in den Speicher herunter und sende es per Anfrage in Go?

WBOY
WBOYnach vorne
2024-02-08 20:51:09783Durchsuche

如何从AWS S3下载对象到内存中并通过Go中的请求发送它?

Frageninhalt

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).


Richtige Antwort


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.pngagcies/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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen