Функция для создания 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

Как вы думаете, это правильно-элегантно-питонический достаточно? Есть ли лучший способ сделать это?

Спасибо!

2 ответа

Решение

За StringIO вы должны обычно использовать o.getvalue() чтобы получить результат. Также, если вы хотите добавить обычный файл в zip-файл, вы можете использовать zf.write('picture.jpg'), Вам не нужно читать это вручную.

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

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

Другие вопросы по тегам