Mengendalikan muat turun fail besar dengan muat turun strim untuk mengelakkan tamat masa dan ralat tindak balas yang lain

Linda Hamilton
Lepaskan: 2024-09-26 16:32:52
asal
941 orang telah melayarinya

Handling large file downloads with stream download to avoid timeout and other response errors

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.

Apakah Masalah dengan Muat Turun Fail Besar?

Apabila pengguna meminta fail yang besar, pelayan web anda perlu:

  • Buka/Muatkan fail pada memori.
  • Bacalah.
  • Hantar semula data kepada pelanggan dalam satu bahagian besar sebagai keseluruhan fail.

Walaupun proses ini kelihatan mudah, ia menjadi bermasalah apabila saiz fail bertambah. Isu yang mungkin anda hadapi termasuk:

  • Tamat masa: Pelayan atau pelanggan mungkin tamat masa jika mengambil masa terlalu lama untuk membaca dan menghantar fail.
  • Memori yang berlebihan: Pelayan mungkin cuba memuatkan keseluruhan fail ke dalam memori, menyebabkan masalah prestasi atau ranap, terutamanya dengan fail yang sangat besar.
  • Gangguan rangkaian: Fail besar meningkatkan risiko sambungan terputus atau menghadapi ralat rangkaian lain.

Penyelesaian: Strim fail dalam ketulan, membenarkan pelayan mengendalikan fail dalam bahagian yang lebih kecil dan boleh diurus, mengurangkan kemungkinan isu ini.

Bagaimanakah Penstriman Mengelakkan Tamat Masa?

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:

  • Jejak memori berkurangan: Hanya sebahagian kecil fail dimuatkan ke dalam memori pada satu masa.
  • Elakkan tamat masa: Dengan memulakan penghantaran lebih awal dan menghantar sebahagian, anda mengelakkan kelewatan yang lama dalam memulakan muat turun, mengurangkan kemungkinan tamat masa.
  • Pengalaman pelanggan: Pelanggan mula menerima data hampir serta-merta, meningkatkan prestasi yang dilihat.

Contoh Melaksanakan Muat Turun Potongan dalam Python

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)

Salin selepas log masuk

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

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!

sumber:dev.to
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan