Django가 대용량 파일 다운로드 요청에 응답
과정과 코드를 간단하게 기록한다. 1. zip 파일로 압축한다.2. 블록별로 zip 파일을 읽고 반환
import os
import zipfile
from django.http import StreamingHttpResponse
def send_zipfile(path, suggestName):
def file_iterator(file_name, chunk_size=512):
with open(file_name, 'rb') as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break
def zipfolder(path, zipfileName):
tmp = os.path.join(path, zipfileName)
archive = zipfile.ZipFile(tmp, 'w', zipfile.ZIP_DEFLATED)
for d in os.listdir(path):
fp = os.path.join(path, d)
if fp != tmp and os.path.isfile(fp):
archive.write(fp, d)
archive.close()
return tmp
the_file_name = zipfolder(path, '%s.zip' % suggestName)
response = StreamingHttpResponse(file_iterator(the_file_name))
response['Content-Type'] = 'application/zip'
response['Content-Disposition'] = 'attachment;filename="%s.zip"' % suggestName
return response