파일 생성을 임의로 막 할 수 없기에 메모리상에 데이터를 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