Django - 파이썬 zip 파일 생성 from 메모리 버퍼

파일 생성을 임의로 막 할 수 없기에 메모리상에 데이터를 zip 으로 묶어서 다운로드 해야 하는 경우가 생긴다. 대부분의 예제들이 파일을 기반으로 되어 있어서 response 로 바로 내려주는 것을 찾기 어려웠는데, 아주 좋은 예제가 있어서 소개한다.

 

이미 많은 곳을 거쳐서 테스트 했는데 아래 코드가 그나마 동작 가능한 코드이다.

https://stackoverflow.com/questions/67454/serving-dynamically-generated-zip-archives-in-django
import io

def my_downloadable_zip(request):
    zip_io = io.BytesIO()
    with zipfile.ZipFile(zip_io, mode='w', compression=zipfile.ZIP_DEFLATED) as backup_zip:
        backup_zip.write('file_name_loc_to_zip') # u can also make use of list of filename location
                                                 # and do some iteration over it
     response = HttpResponse(zip_io.getvalue(), content_type='application/x-zip-compressed')
     response['Content-Disposition'] = 'attachment; filename=%s' % 'your_zipfilename' + ".zip"
     response['Content-Length'] = zip_io.tell()
     return response

 

내생각에는 BytesIO.tell() 이라는 함수가 있는 것을 알고 Content-Length 에 채워주는 것이 핵심 포인트 인듯 하다.

미래를 말씀해주세요 :)

Pavel Danilyuk 님의 사진, 출처: Pexels