> 백엔드 개발 > 파이썬 튜토리얼 > FastAPI 백엔드에 대용량 파일(3GB 이상)을 효율적으로 업로드하는 방법은 무엇입니까?

FastAPI 백엔드에 대용량 파일(3GB 이상)을 효율적으로 업로드하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-11-28 09:46:12
원래의
182명이 탐색했습니다.

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

FastAPI 백엔드에 대용량 파일(≥3GB)을 업로드하는 방법은 무엇입니까?

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 사용

또 다른 옵션은 스트리밍 파일 업로드를 효율적으로 처리할 수 있는 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() 메서드를 사용하여 요청 본문을 스트림으로 구문 분석하고 스트림을 활용합니다. multipart/form-data 구문 분석을 처리하기 위한 ing_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!'}
로그인 후 복사

위 내용은 FastAPI 백엔드에 대용량 파일(3GB 이상)을 효율적으로 업로드하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿