zip 아카이브를 만들어 다운로드하도록 제공 할 수 있지만 여전히 파일을 하드 드라이브에 저장할 수 없습니까?
답변:
다운로드를 시작하려면 Content-Disposition
헤더 를 설정해야합니다 .
from django.http import HttpResponse
from wsgiref.util import FileWrapper
# generate the file
response = HttpResponse(FileWrapper(myfile.getvalue()), content_type='application/zip')
response['Content-Disposition'] = 'attachment; filename=myfile.zip'
return response
디스크에 파일을 저장하지 않으려면 다음을 사용해야합니다. StringIO
import cStringIO as StringIO
myfile = StringIO.StringIO()
while not_finished:
# generate chunk
myfile.write(chunk)
선택적으로 Content-Length
헤더도 설정할 수 있습니다.
response['Content-Length'] = myfile.tell()
FileWrapper
작동했습니다.
임시 파일을 만드는 것이 더 즐거울 것입니다. 이것은 많은 메모리를 절약합니다. 동시에 한 명 또는 두 명 이상의 사용자가있을 때 메모리 절약이 매우 중요하다는 것을 알게 될 것입니다.
그러나 StringIO 개체에 쓸 수 있습니다 .
>>> import zipfile
>>> import StringIO
>>> buffer= StringIO.StringIO()
>>> z= zipfile.ZipFile( buffer, "w" )
>>> z.write( "idletest" )
>>> z.close()
>>> len(buffer.getvalue())
778
"버퍼"개체는 778 바이트 ZIP 아카이브가있는 파일과 유사합니다.
대신 tar 파일을 만드는 것은 어떨까요? 이렇게 :
def downloadLogs(req, dir):
response = HttpResponse(content_type='application/x-gzip')
response['Content-Disposition'] = 'attachment; filename=download.tar.gz'
tarred = tarfile.open(fileobj=response, mode='w:gz')
tarred.add(dir)
tarred.close()
return response
content_type=
대신mimetype=
예, zipfile 모듈 , zlib 모듈 또는 기타 압축 모듈 을 사용하여 메모리에 zip 아카이브를 만들 수 있습니다. HttpResponse
컨텍스트를 템플릿에 보내는 대신 Django 뷰가 반환 하는 객체에 뷰가 zip 아카이브를 쓰도록 할 수 있습니다 . 마지막으로, mimetype을 적절한 형식으로 설정 하여 브라우저가 응답을 파일로 처리하도록 지시해야합니다 .
from django.db import models
class PageHeader(models.Model):
image = models.ImageField(upload_to='uploads')
from django.http import HttpResponse
from StringIO import StringIO
from models import *
import os, mimetypes, urllib
def random_header_image(request):
header = PageHeader.objects.order_by('?')[0]
image = StringIO(file(header.image.path, "rb").read())
mimetype = mimetypes.guess_type(os.path.basename(header.image.name))[0]
return HttpResponse(image.read(), mimetype=mimetype)
http://djangosnippets.org/snippets/365/에 코드 예제가 있습니다.
def download_zip(request,file_name):
filePath = '<path>/'+file_name
fsock = open(file_name_with_path,"rb")
response = HttpResponse(fsock, content_type='application/zip')
response['Content-Disposition'] = 'attachment; filename=myfile.zip'
return response
요구 사항에 따라 zip 및 콘텐츠 유형을 바꿀 수 있습니다.
fsock = open(filePath,"rb")
메모리 내 tgz 아카이브와 동일 :
import tarfile
from io import BytesIO
def serve_file(request):
out = BytesIO()
tar = tarfile.open(mode = "w:gz", fileobj = out)
data = 'lala'.encode('utf-8')
file = BytesIO(data)
info = tarfile.TarInfo(name="1.txt")
info.size = len(data)
tar.addfile(tarinfo=info, fileobj=file)
tar.close()
response = HttpResponse(out.getvalue(), content_type='application/tgz')
response['Content-Disposition'] = 'attachment; filename=myfile.tgz'
return response