Jawaban:
Untuk memicu unduhan, Anda perlu menyetel Content-Dispositionheader:
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
Jika Anda tidak ingin file pada disk Anda perlu menggunakan StringIO
import cStringIO as StringIO
myfile = StringIO.StringIO()
while not_finished:
# generate chunk
myfile.write(chunk)
Secara opsional, Anda juga dapat mengatur Content-Lengthtajuk:
response['Content-Length'] = myfile.tell()
FileWrapper, dan berhasil.
Anda akan lebih senang membuat file sementara. Ini menghemat banyak memori. Bila Anda memiliki lebih dari satu atau dua pengguna secara bersamaan, Anda akan menemukan bahwa penyimpanan memori sangat, sangat penting.
Namun, Anda dapat menulis ke objek StringIO .
>>> import zipfile
>>> import StringIO
>>> buffer= StringIO.StringIO()
>>> z= zipfile.ZipFile( buffer, "w" )
>>> z.write( "idletest" )
>>> z.close()
>>> len(buffer.getvalue())
778
Objek "buffer" adalah seperti file dengan arsip ZIP 778 byte.
Mengapa tidak membuat file tar saja? Seperti:
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=bukannyamimetype=
Ya, Anda dapat menggunakan modul zipfile , modul zlib atau modul kompresi lainnya untuk membuat arsip zip di memori. Anda bisa membuat tampilan Anda menulis arsip zip ke HttpResponseobjek yang dikembalikan tampilan Django alih-alih mengirim konteks ke templat. Terakhir, Anda perlu menyetel mimetype ke format yang sesuai untuk memberi tahu browser agar memperlakukan respons sebagai file .
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)
Ada contoh kode di 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
Anda dapat mengganti zip dan tipe konten sesuai kebutuhan Anda.
fsock = open(filePath,"rb")
Sama dengan di arsip tgz memori:
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