Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk memuat turun objek dari AWS S3 ke dalam memori dan menghantarnya melalui permintaan dalam Go?

Bagaimana untuk memuat turun objek dari AWS S3 ke dalam memori dan menghantarnya melalui permintaan dalam Go?

WBOY
WBOYke hadapan
2024-02-08 20:51:09784semak imbas

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

Kandungan soalan

Bolehkah seseorang membantu saya menyelesaikan ralat yang saya perolehi semasa cuba memuat turun fail daripada s3?

Jadi saya ingin mencipta api perkhidmatan storan melalui go gin, dan saya mahu laluan yang menggunakan kunci objek s3 untuk memuat turun objek dan kemudian menghantar objek ini kembali kepada pelanggan.

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

    })

Kod di atas memberi saya ralat ini: Ralat operasi s3: getobject, kod status ralat respons https: 403, diminta: 8khyw3rcs2za7d95, hos: kolo+gy/dtzrrovswsb1bxinln8w+xdl0lnmysuwjnhupmbvk4itdfp+mq2xuo4ehais accessed: phpcn

Teks permintaan adalah seperti ini:

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

Saya mempunyai semua aws_s3_bucket_name, aws_region, aws_access_key_id, aws_secret_access_key yang disimpan dalam fail .env, dan saya rasa saya telah menetapkannya dengan betul kerana saya mempunyai laluan lain yang memuat naik fail ke s3 (yang berfungsi dengan baik).


Jawapan betul


Kunci fail anda ialah url ini:

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

Ini hanya boleh digunakan daripada klien http, seperti pelayar web atau curl.

Secara khusus, ia bukan kunci objek s3 yang sah. Apabila menggunakan getobject atau api s3 yang serupa, ia mestilah kunci yang sah seperti agcies/photo/xyz.pngagcies/photo/xyz.png dan tidak boleh dikodkan url.

Atas ialah kandungan terperinci Bagaimana untuk memuat turun objek dari AWS S3 ke dalam memori dan menghantarnya melalui permintaan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam