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 ?
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).
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.png
agcies/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!