FastAPI를 사용하다보면 파일 업로드하는 API도 만들게 됨.
일반적인 파일을 업로드하는것은 FastAPI Documents에서 제공된다.
fastapi.tiangolo.com/tutorial/request-files/
하지만, 내가 하고싶은건 암호화 된 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 |
---|