Apabila bekerja dengan muat turun fail besar dalam aplikasi web, salah satu isu biasa yang dihadapi oleh pembangun ialah tamat masa, masa tindak balas, ralat beban memori. Kebanyakan pelayan web dan pelanggan mempunyai pengehadan tentang tempoh mereka akan menunggu respons, dan jika proses muat turun mengambil masa terlalu lama, anda mungkin menghadapi ralat ini. Untuk mengurangkan perkara ini, muat turun penstriman ialah penyelesaian yang lebih cekap dan berskala.
Dalam artikel ini, kami akan meneroka cara menggunakan keupayaan penstriman Python untuk mengendalikan muat turun fail yang besar boleh membantu mengelakkan tamat masa dan ralat respons. Secara khususnya, kami akan membincangkan muat turun terkumpul, cara ia berfungsi dan cara ia boleh mengoptimumkan prestasi apabila berurusan dengan fail besar.
Apabila pengguna meminta fail yang besar, pelayan web anda perlu:
Walaupun proses ini kelihatan mudah, ia menjadi bermasalah apabila saiz fail bertambah. Isu yang mungkin anda hadapi termasuk:
Penyelesaian: Strim fail dalam ketulan, membenarkan pelayan mengendalikan fail dalam bahagian yang lebih kecil dan boleh diurus, mengurangkan kemungkinan isu ini.
Daripada membaca keseluruhan fail ke dalam memori dan menghantarnya dalam satu respons yang besar, penstriman memecahkan fail kepada ketulan yang lebih kecil yang dibaca dan dihantar secara berurutan. Ini membolehkan pelanggan mula menerima bahagian fail lebih awal, dan bukannya menunggu sehingga keseluruhan fail dimuatkan sebelum penghantaran bermula.
Ini sebab penstriman bermanfaat:
biar andaikan anda mahu memuat turun fail daripada Google Drive atau mana-mana storan lain seperti SharePoint, GoogleCloudStorage dsb. kita boleh menggunakan penjana untuk muat turun fail berasaskan chunked, begini rupanya.
GoogleDrive: def generate_chunks(request, chunksize = 10 * 1024 * 1024): #10MB file_buffer = io.BytesIO() downloader = MediaIoBaseDownload(file_buffer, request, chunksize=chunksize) done = False previous_bytes = 0 while not done: status, done = downloader.next_chunk() if status: new_bytes = downloader._progress - previous_bytes file_buffer.seek(previous_bytes) chunk_data = file_buffer.read(new_bytes) previous_bytes = downloader._progress yield chunk_data def file_loader(user_name, file_properties, credentials): file_uri = file_properties["file_uri"] # Your logic from Google Drive Doc to authenticate the user # and getting the file in request request = service.files().get_media(fileId=file_uri) return lambda: GoogleDrive.generate_chunks(request)
Untuk muat turun strim, anda perlu mengendalikan respons seperti ini
file = GoogleDrive.file_loader(user_name, file_properties, credentials) response = Response(file(), content_type='application/octet-stream') filename = "some example file.mp4" response.headers['Content-Disposition'] = f"attachment; filename*=UTF-8''{quote(filename)}" return response
Memasukkan nama fail dalam format yang betul untuk pengekodan UTF-8 akan membantu mengelakkan isu apabila terdapat sebarang emoji atau aksara khas dalam nama fail sekiranya anda menggunakan penamaan fail dinamik daripada db.
Atas ialah kandungan terperinci Mengendalikan muat turun fail besar dengan muat turun strim untuk mengelakkan tamat masa dan ralat tindak balas yang lain. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!