将Presentation对象作为http响应发送以供下载。

时间:2016-12-13 10:48:54

标签: python flask python-requests python-pptx

我正在尝试开发一个烧瓶服务器,它根据json数据和HTTP Post请求中的文件生成一个表示对象。 我能够使用相同的代码在本地生成文件,但是当我尝试发送它时,http响应失败。

以下是将其作为http响应发送的代码段 -

prs_file_io = BytesIO()
prs.save(prs_file_io)
resp = Response()
resp.status_code = 200
resp.set_data(prs_file_io.getvalue())
return resp

这是发送请求并尝试保存文件的python脚本 -

r = requests.post('http://localhost:8181/create-ppt',
                  #data=open('tile_resp.json', 'rb'),
                  files={'1': open('./0NtNFb0F9ch15fDrgYoECEpctPkjvayD.png', 'rb'),
                         'tile_data': open('tile_resp.json', 'rb')})
print(r.content)

最后我将请求脚本的输出传递给pptx文件。

但是这不知道我在这里犯了什么错误?

3 个答案:

答案 0 :(得分:0)

以下内容如何:

response = make_response(prs_file_io.get_value())
response.headers['Content-Type'] = "application/vnd.openxmlformats-officedocument.presentationml.presentation"
response.headers['Content-Description'] = 'attachment; filename=example.pptx'
return response

make_response是Flask的一种方法,请参阅make_response()

如果响应应该是pptx文件,那会有用吗?

答案 1 :(得分:0)

我使用

执行此操作
send_file

通过做:

from flask import send_file
from app import application
from pptx import Presentation
import os

prs=Presentation()
filename = os.path.join(application.root_path, 'test.pptx')
prs.save(filename)
return send_file(filename_or_fp=filename)

在我的代码中,应用程序在app文件夹的python文件中定义,因此行:

from app import application

如果你想走这条路,你必须为你的申请改变这个。

答案 2 :(得分:0)

这是一个老问题,但以上都不适合我,所以我想分享我的解决方案:

prs = Presentation(input)
file = io.BytesIO()
prs.save(file)

response = HttpResponse(content_type='application/vnd.ms-powerpoint')
response['Content-Disposition'] = 'attachment; filename="sample.pptx"'
response.write(file.getvalue())
file.close()
return response