본문 바로가기

Tech/FastAPI

FastAPI zip 파일 업로드

FastAPI를 사용하다보면 파일 업로드하는 API도 만들게 됨.

 

일반적인 파일을 업로드하는것은 FastAPI Documents에서 제공된다.

fastapi.tiangolo.com/tutorial/request-files/

 

Request Files - FastAPI

Request Files You can define files to be uploaded by the client using File. Info To receive uploaded files, first install python-multipart. E.g. pip install python-multipart. This is because uploaded files are sent as "form data". Import File Import File a

fastapi.tiangolo.com

 

하지만, 내가 하고싶은건 암호화 된 Zip 파일을 업로드 한 후, 압축해제 까지 해야하는 것.

내가 구글링을 못하는건지~ 관련 정보가 documents빼고는 찾기 너무힘들다!

 

자세한 동작 과정은 아래 코드 참고.

#import 과정 생략

@router.post(
    path="/upload",
    description="파일 업로드 API"
)
def zipfile_upload(
        zip_password: str = None,
        files: UploadFile = File(...),
) -> Any:
        if zip_password is None or files.content_type != 'application/x-zip-compressed':
            return JSONResponse(
                status_code=status.HTTP_400_BAD_REQUEST,
                content={
                    "message": "bad request",
                }
            )

        zip_file_path = "업로드한 zip 파일이 저장될 경로/저장할 zip 파일명"

        with open(f"{zip_file_path}.zip", 'wb') as upload_zip:
            shutil.copyfileobj(files.file, upload_zip)

        with zipfile.ZipFile(f"{zip_file_path}.zip") as encrypt_zip:
            encrypt_zip.extractall(
                zip_file_path,
                None,
                bytes(zip_password, encoding='utf-8')
            )

 

 

이부분 찾는데 삽질을 좀 했다...........................

        with open(f"{zip_file_path}.zip", 'wb') as upload_zip:
            shutil.copyfileobj(files.file, upload_zip)

 

 

api를 호출하며 업로드 된, files를 확인해보면 zipfile이 다음과 같은 형태로 넘어오게 된다.

(Pdb) files
<starlette.datastructures.UploadFile object at 0x0000026C627A4A48>
(Pdb) files.file
<tempfile.SpooledTemporaryFile object at 0x0000026C627A4AC8>

 

반응형

'Tech > FastAPI' 카테고리의 다른 글

FastAPI Callback 기능 구현  (0) 2021.03.09