Функция для создания zip-файла в памяти и возврата в виде ответа http - PullRequest
6 голосов
/ 09 марта 2010

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

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 ]

12 голосов
/ 09 марта 2010

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

4 голосов
/ 09 марта 2010

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

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

...