[python] Django로 다운로드 할 파일 생성

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 및 콘텐츠 유형을 바꿀 수 있습니다.