Czy można utworzyć archiwum zip i zaoferować je do pobrania, ale nadal nie można zapisać pliku na dysku twardym?
96
Aby uruchomić pobieranie, musisz ustawić Content-Disposition
nagłówek:
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
Jeśli nie chcesz pliku na dysku, musisz użyć StringIO
import cStringIO as StringIO
myfile = StringIO.StringIO()
while not_finished:
# generate chunk
myfile.write(chunk)
Opcjonalnie możesz również ustawić Content-Length
nagłówek:
response['Content-Length'] = myfile.tell()
FileWrapper
i zadziałało.Będziesz szczęśliwszy, tworząc plik tymczasowy. Oszczędza to dużo pamięci. Kiedy masz więcej niż jednego lub dwóch użytkowników jednocześnie, zauważysz, że oszczędzanie pamięci jest bardzo, bardzo ważne.
Możesz jednak pisać do obiektu StringIO .
Obiekt "bufor" jest podobny do pliku z 778-bajtowym archiwum ZIP.
źródło
Dlaczego zamiast tego nie utworzyć pliku tar? Tak jak to:
źródło
content_type=
zamiast tegomimetype=
Tak, można użyć modułu zipfile , moduł zlib lub innych modułów kompresji aby utworzyć archiwum zip w pamięci. Możesz sprawić, by widok zapisywał archiwum zip do
HttpResponse
obiektu, który zwraca widok Django, zamiast wysyłać kontekst do szablonu. Na koniec musisz ustawić typ MIME na odpowiedni format, aby poinstruować przeglądarkę, aby traktowała odpowiedź jako plik .źródło
models.py
views.py
źródło
Przykład kodu znajduje się pod adresem http://djangosnippets.org/snippets/365/
źródło
Możesz zastąpić kod pocztowy i typ zawartości zgodnie z wymaganiami.
źródło
fsock = open(filePath,"rb")
To samo z archiwum tgz w pamięci:
źródło