Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengendalikan muat turun fail S3 tanpa kehabisan sumber

Mengendalikan muat turun fail S3 tanpa kehabisan sumber

WBOY
WBOYke hadapan
2024-02-10 19:36:09941semak imbas

处理 S3 文件下载而不耗尽资源

editor php Xinyi berada di sini untuk memperkenalkan cara yang cekap untuk mengendalikan muat turun fail S3 untuk mengelakkan sumber pelayan yang meletihkan. S3 ialah perkhidmatan storan awan berskala yang disediakan oleh Amazon, tetapi apabila berurusan dengan muat turun fail besar, kaedah muat turun tradisional mungkin menyebabkan sumber pelayan kehabisan. Artikel ini akan memperkenalkan penyelesaian berasaskan PHP yang mengendalikan muat turun fail S3 secara berkesan dan meningkatkan prestasi pelayan serta pengalaman pengguna melalui muat turun dan penstriman yang terkumpul. Mari belajar tentang kaedah ini bersama-sama!

Kandungan soalan

Saya mempunyai aplikasi go-gin yang membenarkan memuat naik dan memuat turun berbilang jenis fail dalam S3.

Semua fail sebelum dimuat naik ke s3 disulitkan menggunakan AWS s3cryptoclient, AES GCM dan kunci daripada KMS. Jadi, setakat baldi s3, semuanya binari.

Saya boleh menggunakan arahan getObject SDK untuk memuat turun fail ke pelayan dan menyahsulitnya, kemudian gunakan io.write(tempfile) untuk menyampaikan fail ini kepada klien untuk dimuat turun.

Masalah di sini ialah S3 mengandungi fail bersaiz 10GB dan pelayan akan diakses oleh berbilang pengguna setiap hari. Seperti yang telah kita lihat, menulis fail sementara pada pelayan dengan 16GB RAM juga boleh menghabiskan memori dengan cepat, sementara kami juga mengambil berat tentang kos menjalankan pelayan sedemikian.

Hambatannya ialah fail perlu dinyahsulit sebelum ia boleh disampaikan, dalam kes penggunaan ini, url yang ditetapkan S3 adalah mencukupi, walaupun penyahsulitan tidak disediakan oleh url yang ditetapkan oleh s3 melainkan ia adalah penyulitan yang dilakukan oleh pelanggan, dalam kes kami Penyulitan AWS sedang diproses jadi penyelesaian ini tidak dapat dilaksanakan.

Adakah sesiapa mempunyai sebarang petua atau kemungkinan kes penggunaan untuk menyelesaikan masalah ini di mana kita boleh menggunakan go-gin/NGINX untuk menulis fail terus kepada pelanggan.

Pemprosesan muat turun fail pengguna semasa

s3FileStream, _ := s3c.GetBucketItem(&utils.S3ObjectBucketInput{
    Bucket: "bucketName",
    Key:    "UserFileName"
})

fileBody, err := io.ReadAll(s3FileStream.Body)
if err != nil {
    panic(err.Error())
}

fileExtension := s3FileStream.Metadata["X-Amz-Meta-Type"]

err = ioutil.WriteFile("file" + *fileExtension, fileBody, 600) // temp file
if err != nil {
    panic(err.Error())
}
c.JSON(http.StatusCreated, string(fileBody))
c.Done()

}

Penyelesaian

Satu pilihan ialah menulis objek terus kepada pelanggan sebagai badan tindak balas:

s3FileStream, _ := s3c.GetBucketItem(&utils.S3ObjectBucketInput{
    Bucket: "bucketName",
    Key:    "UserFileName",
})
fileExtension := s3FileStream.Metadata["X-Amz-Meta-Type"]
c.DataFromReader(http.StatusCreated, 0, "application/data",
    s3FileStream.Body,
    map[string]string{"Content-Dispositon": "attachment; filename=" + "file" + *fileExtension})
c.Done()

Atas ialah kandungan terperinci Mengendalikan muat turun fail S3 tanpa kehabisan sumber. 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