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

'form-data'를 사용하여 FastAPI 서버에 파일을 효율적으로 업로드하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-07 20:30:13481검색

How to Efficiently Upload Files to a FastAPI Server Using `form-data`?

양식 데이터 및 SpooledTemporaryFile을 사용하여 FastAPI로 파일 업로드

멀티파트/양식 데이터와 함께 FastAPI를 사용하여 파일을 업로드하려면 설치하는 것이 좋습니다. 멀티파트 파일인 python-multipart는 다음을 통해 전송됩니다. form-data.

pip install python-multipart

다음은 FastAPI를 사용하여 파일을 업로드하는 개선된 예입니다.

from fastapi import File, UploadFile
from typing import List

@app.post("/upload")
def upload(file: UploadFile = File(...)):
    try:
        # Using file.file for synchronous operations (e.g., opening a file on disk)
        contents = file.file.read()
        with open(file.filename, 'wb') as f:
            f.write(contents)
    except Exception:
        return {"message": "An error occurred while uploading the file."}
    finally:
        file.file.close()

    return {"message": f"Successfully uploaded {file.filename}"}

큰 파일을 청크로 처리해야 하는 경우 파일을 더 작은 단위로 읽는 것이 좋습니다. . 수동 루프를 사용할 수 있습니다:

@app.post("/upload")
def upload(file: UploadFile = File(...)):
    try:
        with open(file.filename, 'wb') as f:
            while contents := file.file.read(1024 * 1024):
                f.write(contents)
    except Exception:
        return {"message": "An error occurred while uploading the file."}
    finally:
        file.file.close()

    return {"message": f"Successfully uploaded {file.filename}"}

또는 데이터를 청크로 읽고 쓰는 quitil.copyfileobj() 메서드를 사용할 수 있습니다:

from shutil import copyfileobj

@app.post("/upload")
def upload(file: UploadFile = File(...)):
    try:
        with open(file.filename, 'wb') as f:
            copyfileobj(file.file, f)
    except Exception:
        return {"message": "An error occurred while uploading the file."}
    finally:
        file.file.close()

    return {"message": f"Successfully uploaded {file.filename}"}

추가 참고 사항 :

  • FastAPI는 SpooledTemporaryFile을 사용합니다. 메모리에 데이터를 저장하는 파일 업로드용입니다. 1MB보다 큰 파일의 경우 데이터는 디스크의 임시 파일에 기록됩니다.
  • async def로 엔드포인트를 정의하는 경우 이 답변에 언급된 대로 비동기 파일 처리를 사용하세요. [https://stackoverflow.com/a/69868184/6616846](https://stackoverflow.com/a/69868184/6616846)
  • 여러 파일을 업로드하려면 다음에서 UploadFile 객체 목록을 사용할 수 있습니다. 엔드포인트 기능을 사용하세요.
  • HTML 양식 예시는 원본에 제공된 링크를 참조하세요. 대답하세요.

위 내용은 'form-data'를 사용하여 FastAPI 서버에 파일을 효율적으로 업로드하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.