使用Django下载完全在内存中创建的zip文件

时间:2015-04-21 10:48:32

标签: django zip

我需要生成几个csv报告,压缩并作为zip提供给用户。我使用this snippet作为参考

    ...
    temp = StringIO.StringIO()
    with zipfile.ZipFile(temp,'w') as archive:
        for device in devices:
            csv = Mymodel.get_csv_for(device)
            archive.writestr('{}_device.csv'.format(device), str(csv))

    response = HttpResponse(FileWrapper(temp), content_type='application/zip')
    response['Content-Disposition'] = 'attachment; filename="devices.zip"')

    return response

查看archive.listname()我可以看到文件名。 看temp.getvalue()我可以看到一些字符串但是当我下载文件时它会显示为空。

1 个答案:

答案 0 :(得分:2)

您需要在返回响应之前调用temp.seek(0),否则Python将尝试从其末尾读取内存文件(在将归档写入之后将其保留在其中),因此将无法找到任何内容和返回一个空的HTTP响应。

您还需要使用StreamingHttpResponse代替HttpResponse

这会给:

...
temp = StringIO.StringIO()
with zipfile.ZipFile(temp,'w') as archive:
    for device in devices:
        csv = Mymodel.get_csv_for(device)
        archive.writestr('{}_device.csv'.format(device), str(csv))

response = StreamingHttpResponse(FileWrapper(temp), content_type='application/zip')
response['Content-Disposition'] = 'attachment; filename="devices.zip"')
response['Content-Length'] = temp.tell()

temp.seek(0)

return response