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()
답변
임시 파일을 만드는 것이 더 즐거울 것입니다. 이것은 많은 메모리를 절약합니다. 동시에 한 명 또는 두 명 이상의 사용자가있을 때 메모리 절약이 매우 중요하다는 것을 알게 될 것입니다.
그러나 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
답변
예, zipfile 모듈 , zlib 모듈 또는 기타 압축 모듈 을 사용하여 메모리에 zip 아카이브를 만들 수 있습니다. HttpResponse
컨텍스트를 템플릿에 보내는 대신 Django 뷰가 반환 하는 객체에 뷰가 zip 아카이브를 쓰도록 할 수 있습니다 . 마지막으로, mimetype을 적절한 형식으로 설정 하여 브라우저가 응답을 파일로 처리하도록 지시해야합니다 .
답변
models.py
from django.db import models
class PageHeader(models.Model):
image = models.ImageField(upload_to='uploads')
views.py
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 및 콘텐츠 유형을 바꿀 수 있습니다.