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

FastAPI를 사용하여 대용량 파일을 효율적으로 업로드하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2024-12-02 01:13:11
원래의
845명이 탐색했습니다.

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 사용법: upload_file에 대한 필드를 선언할 때 MultipartEncoder에 파일 이름이 포함되어 있는지 확인하세요.
  3. 라이브러리 권장 사항: 오래된 라이브러리 사용 (예: 요청 도구 벨트) 파일 업로드는 권장되지 않습니다. 대신 Python 요청이나 HTTPX를 사용하는 것이 좋습니다. 대용량 파일 업로드에 대한 더 나은 지원을 제공하기 때문입니다.

.stream()을 사용하는 더 빠른 옵션

요청에 액세스 본문을 스트림으로 저장하면 전체 파일을 메모리에 로드하지 않아도 되어 업로드 속도가 빨라집니다. 이는 .stream() 메소드를 사용하여 달성할 수 있습니다. 다음은 스트리밍 양식 데이터 라이브러리를 사용하는 예입니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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