Ist es möglich, ein Zip-Archiv zu erstellen und zum Herunterladen anzubieten, aber dennoch keine Datei auf der Festplatte zu speichern?
96
Um einen Download auszulösen, müssen Sie den Content-Disposition
Header festlegen :
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
Wenn Sie die Datei nicht auf der Festplatte haben möchten, müssen Sie sie verwenden StringIO
import cStringIO as StringIO
myfile = StringIO.StringIO()
while not_finished:
# generate chunk
myfile.write(chunk)
Optional können Sie auch den Content-Length
Header festlegen :
response['Content-Length'] = myfile.tell()
FileWrapper
und es hat funktioniert.Sie werden glücklicher sein, eine temporäre Datei zu erstellen. Das spart viel Speicher. Wenn Sie mehr als einen oder zwei Benutzer gleichzeitig haben, ist die Speichereinsparung sehr, sehr wichtig.
Sie können jedoch in ein StringIO- Objekt schreiben .
Das "Puffer" -Objekt ist dateiähnlich mit einem 778-Byte-ZIP-Archiv.
quelle
Warum nicht stattdessen eine TAR-Datei erstellen? Wie so:
quelle
content_type=
anstelle vonmimetype=
Ja, Sie können das zipfile-Modul , das zlib-Modul oder andere Komprimierungsmodule verwenden , um ein zip-Archiv im Speicher zu erstellen. Sie können Ihre Ansicht veranlassen, das Zip-Archiv in das
HttpResponse
Objekt zu schreiben, das die Django-Ansicht zurückgibt, anstatt einen Kontext an eine Vorlage zu senden. Zuletzt müssen Sie den Mimetyp auf das entsprechende Format einstellen , damit der Browser die Antwort als Datei behandelt .quelle
models.py
views.py
quelle
Es gibt ein Codebeispiel unter http://djangosnippets.org/snippets/365/
quelle
Sie können die Postleitzahl und den Inhaltstyp gemäß Ihren Anforderungen ersetzen.
quelle
fsock = open(filePath,"rb")
Gleiches gilt für das tgz-Archiv im Speicher:
quelle