使用 FastAPI 的伺服器端上傳大型檔案
FastAPI 伺服器可以使用 UploadFile 類別處理大型檔案。以下是範例:
async def uploadfiles(upload_file: UploadFile = File(...)): ...
客戶端請求問題
從客戶端發送大檔案時,可能會因下列原因而出現問題:
使用.stream() 的更快選項
透過存取請求body 作為流,可以避免將整個檔案載入記憶體中,從而提高上傳速度。這可以使用 .stream() 方法來實現。以下是使用streaming-form-data庫的範例:
from streaming_form_data import StreamingFormDataParser from streaming_form_data.targets import FileTarget request_body = await request.stream() parser = StreamingFormDataParser(headers=request.headers) parser.register('upload_file', FileTarget(filepath)) async for chunk in request_body: parser.data_received(chunk)
使用UploadFile和Form的替代選項
如果您喜歡使用常規的d ef端點,您可以可以處理文件上傳如下:
from fastapi import File, UploadFile, Form, HTTPException, status import aiofiles import os CHUNK_SIZE = 1024 * 1024 @app.post("/upload") async def upload(file: UploadFile = File(...), data: str = Form(...)): try: filepath = os.path.join('./', os.path.basename(file.filename)) async with aiofiles.open(filepath, 'wb') as f: while chunk := await file.read(CHUNK_SIZE): await f.write(chunk) except Exception: raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail='There was an error uploading the file') finally: await file.close() return {"message": f"Successfuly uploaded {file.filename}"}
增加HTTPX客戶端超時
使用HTTPX庫時,可能需要增加逾時,以防止大文件上傳時讀取逾時。
timeout = httpx.Timeout(None, read=180.0)
以上是如何使用FastAPI高效上傳大檔案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!