首頁 >後端開發 >Python教學 >如何使用FastAPI高效上傳大檔案?

如何使用FastAPI高效上傳大檔案?

Linda Hamilton
Linda Hamilton原創
2024-12-02 01:13:11842瀏覽

How to Efficiently Upload Large Files with FastAPI?

使用 FastAPI 的伺服器端上傳大型檔案

FastAPI 伺服器可以使用 UploadFile 類別處理大型檔案。以下是範例:

async def uploadfiles(upload_file: UploadFile = File(...)):
    ...

客戶端請求問題

從客戶端發送大檔案時,可能會因下列原因而出現問題:

  1. multipart/form-data 標頭:客戶端的請求應將Content-Type 標頭指定為 multipart/form-data,後面跟著必要的邊界字串。但是,如果您不使用庫來處理文件上傳,則必須手動設定此標頭。
  2. MultipartEncoder 用法:確保 MultipartEncoder 在宣告 upload_file 欄位時包含檔案名稱。
  3. 函式庫推薦:使用過時的函式庫(例如,不建議使用 requests-toolbelt)進行檔案上傳。考慮使用 Python 請求或 HTTPX,因為它們為大檔案上傳提供更好的支援。

使用.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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn