Mengendalikan muat turun fail S3 tanpa kehabisan sumber

WBOY
Lepaskan: 2024-02-10 19:36:09
ke hadapan
902 orang telah melayarinya

处理 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()
Salin selepas log masuk

}

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()
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!