在 Web 應用程式中處理大型檔案下載時,開發人員面臨的常見問題之一是逾時、回應時間、記憶體過載錯誤。大多數網頁伺服器和用戶端對等待回應的時間都有限制,如果下載過程花費太長時間,您可能會遇到這些錯誤。為了緩解這個問題,串流下載是一種更有效率且可擴展的解決方案。
在本文中,我們將探討如何使用 Python 的串流功能處理大型檔案下載來幫助避免逾時和回應錯誤。具體來說,我們將討論分塊下載、它們的工作原理以及它們在處理大型檔案時如何優化效能。
當使用者要求大檔案時,您的網頁伺服器需要:
雖然這個過程聽起來很簡單,但隨著檔案大小的增加,它就會變得有問題。您可能遇到的問題包括:
解決方案:以區塊的形式串流文件,允許伺服器以更小的、可管理的片段處理文件,從而減少出現這些問題的可能性。
串流不是將整個檔案讀入記憶體並在一個大型回應中發送,而是將檔案分成較小的區塊,然後按順序讀取和傳輸。這允許客戶端更早開始接收文件的部分內容,而不是在傳輸開始之前等待整個文件載入。
這就是串流媒體有益的原因:
假設您想從 Google Drive 或任何其他儲存空間(如 SharePoint、GoogleCloudStorage 等)下載檔案。我們可以使用 生成器 進行基於分塊的檔案下載,如下所示。
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)
對於串流下載,您必須處理類似這樣的回應
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
以 UTF-8 編碼的正確格式包含檔案名稱將有助於避免在使用資料庫的動態檔案命名時檔案名稱中存在任何表情符號或特殊字元時出現問題。
以上是使用串流下載處理大型檔案下載,以避免逾時和其他回應錯誤的詳細內容。更多資訊請關注PHP中文網其他相關文章!