FastAPI에서 업로드 된 파일을 저장하는 방법

파일을 수신하고 로컬에 저장하는 단계별 가이드

작성자 별 이미지

오늘 주제는 사용자가 FastAPI 서버에 로컬로 업로드 한 이미지 또는 텍스트 파일을 디스크에 저장하는 것입니다. 이전에 Flask를 사용한 적이 있다면 file.save파일 저장을위한 자체 내장 기능 이 함께 제공된다는 것을 알아야 합니다. 불행히도 이러한 기능은이 글을 쓰는 시점에 FastAPI에 없습니다. 이 자습서에서는 자신의 사용 사례를 기반으로이 기능을 구현하는 방법을 배웁니다.

단일 파일

참고로 이미지 또는를 통해 업로드 된 파일을 수락하는 간단한 FastAPI 서버의 최소 코드 FormData는 다음과 같습니다.

from fastapi import FastAPI, File, UploadFile

app = FastAPI()

@app.post("/image")
async def image(image: UploadFile = File(...)):
    return {"filename": image.filename}

업로드 된 파일을 받으려면 python-multipart. 가상 환경에 설치해야하는 경우 터미널에서 다음 명령을 실행하십시오.

pip install python-multipart

UploadFilePython SpooledTemporaryFile객체를 사용하므로 파일 크기가 크기 제한 내에있는 한 메모리에 저장됩니다. 그렇지 않으면 크기 제한을 초과하면 디스크에 저장됩니다.

에서 상속하므로 Starlette다음과 같은 속성이 있습니다.

  • filename— 파일 이름. 업로드 된 원본 파일 이름을 기반으로합니다.
  • content_type— 파일의 콘텐츠 유형입니다. 예를 들어 JPEG 이미지 파일은 image/jpeg.
  • file — Python 파일 객체.
  • write(data)— 파일에 데이터를 씁니다. 문자열 또는 바이트를 허용합니다.
  • read(size)— 입력 매개 변수에 따라 n 개의 바이트 또는 파일 문자를 읽습니다. 정수를 허용합니다.
  • seek(offset)— 파일에서 바이트 또는 문자 위치로 이동합니다. 를 사용 seek(0)하면 파일의 시작 부분으로 이동합니다.
  • close() — 파일을 닫습니다.

Flask에는 file.save업로드 된 파일을 디스크에 로컬로 저장할 수 있는 래퍼 기능이 있습니다. 래퍼는 shutils.copyfileobj()Python 표준 라이브러리의 일부인 함수를 기반으로합니다 . 그러나이 글을 쓰는 시점에는 아직 FastAPI에 대한 그러한 구현이 없습니다.

FastAPI 서버 내에서 쉽게 구현할 수 있습니다. 먼저 shutil모듈 을 가져와야합니다 .

import shutil

with open("destination.png", "wb") as buffer:
    shutil.copyfileobj(image.file, buffer)

async def image(image: UploadFile = File(...)):
    with open("destination.png", "wb") as buffer:
        shutil.copyfileobj(image.file, buffer)
    
    return {"filename": image.filename}

여러 파일

여러 파일 업로드를 처리하려면 다음 문을 가져와야합니다.

from typing import List

async def image(images: List[UploadFile] = File(...)):

for image in images:
    with open(image.filename, "wb") as buffer:
        shutil.copyfileobj(image.file, buffer)

오늘 배운 내용을 요약 해 보겠습니다.

업로드 된 파일을 저장하기위한 FastAPI의 래퍼 기능이 없음을 설명하는 간단한 문제 설명으로 시작했습니다.

다음으로 UploadFile의 기본 개념과 FastAPI 서버 내에서 사용하는 방법에 대해 심층적으로 살펴 보았습니다.

또한 내장 된 shutil.copyfileobj 메서드를 사용하여 간단한 파일 저장 기능을 구현했습니다. 또한 여러 파일 업로드를 처리하기 위해 서버를 확장하려고했습니다.

이 글을 읽어 주셔서 감사합니다. 다음 기사에서 다시 뵙기를 바랍니다!

참고 문헌

  1. FastAPI 요청 파일
  2. 업로드 된 파일 저장 FastAPI Github 문제

Suggested posts

N + 1 문제 선택

모든 것은 비용이 있습니다.

N + 1 문제 선택

개발자의 경우 ORM (Object-relational mapping)을 사용하면 삶을 상당히 단순화 할 수 있지만 알아야 할 자체 캐치 세트가 있습니다. 더 심각한 문제 중 하나는 Select N + 1 문제입니다.

정규식을 사용한 문자열의 패턴 일치.

정규식을 사용한 문자열의 패턴 일치.

정규식 또는 정규식은 축약 된 형식 언어로 작성됩니다. 일반적으로 정규식은 소스 데이터가있는 정규식 프로세서에 제공하는 패턴으로 생각할 수 있습니다.

Related posts

"실용적인 프로그래머"의 5 가지 필수 사항

역대 베스트셀러 코딩 북의 요점

"실용적인 프로그래머"의 5 가지 필수 사항

Pragmatic Programmer는 1999 년에 처음 출판되었으며 이후 역대 최고의 프로그래밍 책으로 선정되었습니다. 저자 Andy Hunt와 David Thomas는 Agile Manifesto의 원저자 중 하나였으며 몇 가지 심각한 자격을 가지고 있습니다.

대규모 GraphQL 쿼리 공격으로부터 보호

공격자가 공개적으로 사용 가능한 GraphQL 인터페이스를 사용하여 사이트를 스크랩하거나 서비스 거부 공격을 실행하는 방법에 대해 알아보십시오. 이들은 4 가지 방법 중 하나로이를 수행 할 수 있습니다. 단일 대형 쿼리를 신중하게 구성하여 실행하고, 관련 데이터를 가져올 수있는 병렬 쿼리를 많이 작성하고, 일괄 요청을 사용하여 많은 쿼리를 연속적으로 실행하고, 마지막으로 많은 요청을 보냅니다.

기술 인터뷰의 사회적 구성 요소

코딩 문제는 스트레스가 많지만 스트레스에 대한 당신의 반응은 당신의 기술적 능력보다 더 크게 말합니다.

기술 인터뷰의 사회적 구성 요소

기술 업계의 직책을 위해 인터뷰 할 때 일반적으로 제안을 고려하기 전에 최소한 3 차례의 인터뷰를 거치게됩니다. 라운드는 일반적으로 다음과 같습니다. 그렇게 생각하면 잘못된 것입니다.

훌륭한 개발자의 3 가지 행동 특성

훌륭한 개발자의 3 가지 행동 특성

훌륭한 개발자를 만드는 비 기술적 인 것들 나는이 기사를 작성하는 것을 한동안 미루고 있습니다. 나는 그것을 작성할 자격이 있다고 생각하지 못했습니다. 오늘은 쓸 때라고 생각했습니다.