Python / Django - 我可以创建多个pdf文件类对象,压缩它们并作为附件发送吗?

时间:2013-01-15 09:50:01

标签: python django

我正在使用Django创建一个Web应用程序,其中输入一些参数并创建绘图。我想要一个链接,将下载zip文件中的所有图。为此,我正在编写一个视图,它将创建所有绘图(我已经编写了创建每个单独的图并显示它们的视图),然后将它们压缩,将zip文件保存为响应对象。

我可以这样做的一种方法是创建每个绘图,将其作为pdf文件保存到磁盘,然后最后将它们全部压缩为响应。但是,如果可能的话,我想回避保存到磁盘?

干杯。

2 个答案:

答案 0 :(得分:4)

根据Krzysiek建议使用StringIO,这对我有用。这里canvas是由matplotlib创建的canvas对象。

#Create the file-like objects from canvases
file_like_1 = StringIO.StringIO()
file_like_2 = StringIO.StringIO()
#... etc...
canvas_1.print_pdf(file_like_1)
canvas_2.print_pdf(file_like_2)
#...etc....

#NOW create the zipfile
response = HttpResponse(mimetype='application/zip')
response['Content-Disposition'] = 'filename=all_plots.zip'

buff = StringIO.StringIO()
archive = zipfile.ZipFile(buff,'w',zipfile.ZIP_DEFLATED)
archive.writestr('plot_1.pdf',file_like_1.getvalue())
archive.writestr('plot_2.pdf',file_like_2.getvalue())
#..etc...
archive.close()
buff.flush()
ret_zip = buff.getvalue()
buff.close()
response.write(ret_zip)
return response

所有这些的拉链部分取自https://code.djangoproject.com/wiki/CookBookDynamicZip

答案 1 :(得分:2)

查看StringIO python模块。它在内存中的字符串上实现file行为。