Функция для создания zip-файла в памяти и возврата в виде ответа HTTP
Вопрос
Я избегаю создания файлов на диске, вот что у меня пока получается:
def get_zip(request):
import zipfile, StringIO
i = open('picture.jpg', 'rb').read()
o = StringIO.StringIO()
zf = zipfile.ZipFile(o, mode='w')
zf.writestr('picture.jpg', i)
zf.close()
o.seek(0)
response = HttpResponse(o.read())
o.close()
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = "attachment; filename=\"picture.zip\""
return response
Как вы думаете, это достаточно правильно-элегантно-питонично?Есть ли лучший способ сделать это?
Спасибо!
Решение
Для StringIO
обычно вам следует использовать o.getvalue()
чтобы получить результат.Кроме того, если вы хотите добавить обычный файл в zip-файл, вы можете использовать zf.write('picture.jpg')
.Вам не нужно читать его вручную.
Другие советы
Отказ от дисковых файлов может замедлить сканирование вашего сервера, но это, безусловно, сработает.
Вы исчерпаете память, если будете обслуживать слишком много таких запросов одновременно.
Не связан с StackOverflow