Функция для создания zip-файла в памяти и возврата в виде ответа HTTP

StackOverflow https://stackoverflow.com/questions/2411514

  •  18-09-2019
  •  | 
  •  

Вопрос

Я избегаю создания файлов на диске, вот что у меня пока получается:

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').Вам не нужно читать его вручную.

Другие советы

Отказ от дисковых файлов может замедлить сканирование вашего сервера, но это, безусловно, сработает.

Вы исчерпаете память, если будете обслуживать слишком много таких запросов одновременно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top