Можно ли сделать zip архив и предложить его скачать, но все равно не сохранить файл на жесткий диск?
96
Для запуска загрузки вам необходимо установить 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()
FileWrapper
, и это сработало.Вы будете счастливее, создав временный файл. Это экономит много памяти. Когда у вас одновременно работает более одного или двух пользователей, вы обнаружите, что экономия памяти очень и очень важна.
Однако вы можете писать в объект StringIO .
Объект "буфер" подобен файлу с архивом ZIP 778 байт.
источник
Почему бы вместо этого не сделать tar-файл? Вот так:
источник
content_type=
вместоmimetype=
Да, вы можете использовать ZipFile модуль , модуль ZLIB или другие модули сжатия для создания архива почтового индекса в памяти. Вы можете заставить ваше представление записывать zip-архив в
HttpResponse
объект, который возвращает представление Django, вместо отправки контекста в шаблон. Наконец, вам нужно установить для mimetype соответствующий формат, чтобы браузер обрабатывал ответ как файл .источник
models.py
views.py
источник
Пример кода есть на http://djangosnippets.org/snippets/365/
источник
Вы можете заменить zip и тип содержимого в соответствии с вашими требованиями.
источник
fsock = open(filePath,"rb")
То же самое с tgz архивом в памяти:
источник