Maison >développement back-end >Golang >Comment télécharger un objet d'AWS S3 en mémoire et l'envoyer via requête dans Go ?

Comment télécharger un objet d'AWS S3 en mémoire et l'envoyer via requête dans Go ?

WBOY
WBOYavant
2024-02-08 20:51:09865parcourir

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

Contenu de la question

Quelqu'un peut-il m'aider à résoudre cette erreur que je reçois lorsque j'essaie de télécharger un fichier depuis s3 ?

Je souhaite donc créer une API de service de stockage via go gin, et je veux une route qui utilise une clé d'objet s3 pour télécharger un objet, puis renvoyer cet objet au client.

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

    })

Le code ci-dessus me donne cette erreur : Erreur d'opération s3 : getobject, code d'état d'erreur de réponse https : 403, ID de demande : 8khyw3rcs2za7d95, ID d'hôte : kolo+gy/dtzrrovswsb1bxinln8w+xdl0lnmysuwjnhupmbvk4itdfp+mq2xuo8ehasnx/fai4i=, erreur API accessdenied : accès refusé phpcnendc pcn

Le texte de la demande est le suivant :

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

J'ai tous ces aws_s3_bucket_name, aws_region, aws_access_key_id, aws_secret_access_key stockés dans des fichiers .env, et je pense que je les ai définis correctement car j'ai une autre route qui télécharge les fichiers sur s3 (qui fonctionne très bien).


Bonne réponse


Votre clé de fichier est cette URL :

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

Cela ne peut être utilisé qu'à partir d'un client http, tel qu'un navigateur Web ou curl.

Plus précisément, ce n'est pas une clé d'objet s3 valide. Lorsque vous utilisez getobject ou une API s3 similaire, il doit s'agir d'une clé valide telle que agcies/photo/xyz.pngagcies/photo/xyz.png et ne doit pas être codée en URL.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer