엑셀이 ZIP 파일이었다니!!

Hyunsoo Lim·2024년 6월 17일
0

외부에 엑셀 파일 업로드 API를 연동했는데, 에러가 난다고 해 살펴보니 xlsx 포맷이 아니라 csv 포맷을 올려서 문제였던 것.

openpyxl 라이브러리를 이용해 엑셀 파일을 열게끔 코드가 짜져있었는데, 일단 load_workbook은 csv 파일을 열지 못한다.

try-except 로 에러 핸들링을 하려고 보니, openpyxl의 Exception인 InvalidFileException 에 잡히지 않고 zipfile.BadZipfile 에러가 발생하는게 아닌가?!

추적해보니 두 가지 문제(?)가 혼재되어 있었다.

  1. xlsx 파일은 실제로는 ZIP 아카이브 형식으로 구성되어 있다?!!! 관련 링크
  2. 파일 객체를 열 때는 InvalidFileException이 발생하지만, 요청(request)으로 들어온 파일은 InMemoryUploadedFile 객체로 생성되기 때문에 InvalidFileException 대신 BadZipfile 예외가 발생

일단 엑셀 파일이 zip 형식이란 걸 처음 알아 놀라서 실제 zip 파일을 올리면 어떻게 되나 테스트 해보니 결과는 다음과 같다.

  1. BadZipfile 통과함!!
  2. There is no item named '[Content_Types].xml' in the archive 란 에러 메세지 발생

이건 또 뭔가해서 뒤져보니 (phind.com 땡큐) 아래와 같이 답해준다.

  • XLSX 파일은 실제로 ZIP 아카이브 형식으로 구성
    • 이 안에는 여러 개의 XML 파일과 다른 리소스들이 포함되어 있음.
  • 구성 파일 목록 및 역할
    • [Content_Types].xml: 이 파일은 XLSX 아카이브 내의 각 파일의 MIME 타입을 정의함. 이 정보는 파일의 종류와 내용을 식별하는 데 사용됨.
    • Workbook.xml: 워크북의 메타데이터와 설정을 포함하며, 워크북 전체의 참조를 담고 있음.
    • Worksheet.xml: 각 시트의 데이터와 속성을 포함하는 XML 파일. 각 셀의 값, 스타일, 포맷 등이 이 파일에 저장.
    • SharedStrings.xml: 공유 문자열을 저장하는 파일
    • Images: 이미지 파일들은 ZIP 아카이브 내에 직접 포함되며, 각 이미지에 대한 참조가 [Content_Types].xml와 관계 부분들에 의해 관리
    • 관련 링크
profile
잡식형 괴발자

0개의 댓글