ホームページ >バックエンド開発 >Python チュートリアル >大きなファイル (3 GB 以上) を FastAPI バックエンドに効率的にアップロードするにはどうすればよいですか?
requests-toolbelt ライブラリを使用する場合、 Upload_file のフィールドを宣言するときは、ファイル名と Content-Type ヘッダーの両方を必ず指定してください。以下に例を示します。
filename = 'my_file.txt' m = MultipartEncoder(fields={'upload_file': (filename, open(filename, 'rb'))}) r = requests.post( url, data=m, headers={'Content-Type': m.content_type}, verify=False, ) print(r.request.headers) # confirm that the 'Content-Type' header has been set.
もう 1 つのオプションは、ストリーミング ファイルのアップロードを効率的に処理できる Python のリクエストまたは HTTPX ライブラリを使用することです。それぞれの例を次に示します。
リクエストの使用:
import requests url = '...' filename = '...' with open(filename, 'rb') as file: r = requests.post( url, files={'upload_file': file}, headers={'Content-Type': 'multipart/form-data'}, )
HTTPX の使用:
import httpx url = '...' filename = '...' with open(filename, 'rb') as file: r = httpx.post( url, files={'upload_file': file}, )
HTTPX 自動的にはストリーミング ファイルのアップロードをサポートしますが、リクエストでは Content-Type ヘッダーを次のように設定する必要があります。 'multipart/form-data'.
FastAPI の .stream() メソッドを使用すると、リクエスト本文にストリームとしてアクセスすることで、大きなファイルをメモリにロードすることを回避できます。 。このアプローチを使用するには、次の手順に従います。
アップロードされたファイルのサイズが指定された制限を超えない場合は、MaxSizeValidator を使用できます。以下に例を示します。
from streaming_form_data import streaming_form_data from streaming_form_data import MaxSizeValidator FILE_SIZE_LIMIT = 1024 * 1024 * 1024 # 1 GB def validate_file_size(chunk: bytes): if FILE_SIZE_LIMIT > 0: streaming_form_data.validators.MaxSizeValidator( FILE_SIZE_LIMIT). __call__(chunk)
これらの手法を組み込んだエンドポイントの例を次に示します。
from fastapi import FastAPI, File, Request from fastapi.responses import HTMLResponse from streaming_form_data.targets import FileTarget, ValueTarget from streaming_form_data import StreamingFormDataParser app = FastAPI() @app.post('/upload') async def upload(request: Request): # Parse the HTTP headers to retrieve the boundary string. parser = StreamingFormDataParser(headers=request.headers) # Register FileTarget and ValueTarget objects. file_ = FileTarget() data = ValueTarget() parser.register('upload_file', file_) parser.register('data', data) async for chunk in request.stream(): parser.data_received(chunk) # Validate file size (if necessary) validate_file_size(file_.content) # Process the uploaded file and data. return {'message': 'File uploaded successfully!'}
以上が大きなファイル (3 GB 以上) を FastAPI バックエンドに効率的にアップロードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。