ホームページ >バックエンド開発 >Python チュートリアル >大きなファイル (3 GB 以上) を FastAPI バックエンドに効率的にアップロードするにはどうすればよいですか?

大きなファイル (3 GB 以上) を FastAPI バックエンドに効率的にアップロードするにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-28 09:46:12117ブラウズ

How to Efficiently Upload Large Files (≥3GB) to a FastAPI Backend?

大きなファイル (3 GB 以上) を FastAPI バックエンドにアップロードする方法?

Requests-Toolbelt の使用

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.

Python リクエスト/HTTPX の使用

もう 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() メソッドの使用

FastAPI の .stream() メソッドを使用すると、リクエスト本文にストリームとしてアクセスすることで、大きなファイルをメモリにロードすることを回避できます。 。このアプローチを使用するには、次の手順に従います。

  1. ストリーミング フォーム データ ライブラリをインストールします。 このライブラリは、マルチパート/フォーム データ データのストリーミング パーサーを提供します。
  2. FastAPI エンドポイントを作成します: .stream() メソッドを使用して、リクエスト本文をストリームとして解析します。そして、ストリーム ing_form_data ライブラリを利用して、multipart/form-data の解析を処理します。
  3. ターゲットの登録: ファイル データとフォーム データの解析をそれぞれ処理する FileTarget オブジェクトと ValueTarget オブジェクトを定義します。

アップロードされたファイル サイズの検証

アップロードされたファイルのサイズが指定された制限を超えない場合は、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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。