FastAPI のサーバー側を使用した大きなファイルのアップロード
FastAPI サーバーは、UploadFile クラスを使用して大きなファイルのアップロードを処理できます。以下に例を示します。
async def uploadfiles(upload_file: UploadFile = File(...)): ...
クライアント側リクエストの問題
クライアントから大きなファイルを送信すると、次のことが原因で問題が発生する可能性があります。
.stream() を使用した高速オプション
リクエストにアクセスすることにより本文をストリームとして保存すると、ファイル全体をメモリにロードする必要がなくなり、アップロードが高速化されます。これは、.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 を使用した代替オプション
通常の def エンドポイントを使用したい場合は、次のようにファイルのアップロードを処理できます:
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 中国語 Web サイトの他の関連記事を参照してください。