Rumah > Artikel > pembangunan bahagian belakang > Mengendalikan muat turun fail S3 tanpa kehabisan sumber
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!
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()
}
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!