语境
我有一个 python 脚本,它使用 openpyxl 和 python-pptx 库分别生成工作簿和 PowerPoint。这些文件需要通过 Microsoft Graph API 作为八位字节流直接从虚拟内存上传。
障碍
由于该save_virtual_workbook
方法返回内存中的工作簿,因此所有工作簿都适用于工作簿;但是我知道没有类似的方法,因此以可以通过该方法save_virtual_presentation
流式传输的形式获取 Presentation 对象一直是一个挑战。io.BytesIO.read()
python.pptx文档说这Presentation.save(file)
有效......
“其中
file
可以是文件的路径(字符串)或类似文件的对象。”
除了在执行 POC 时,我没有保存到本地文件系统的选项,所以我尝试了各种使用类似文件的对象的方法。除了下面的尝试之外,没有一个接近在对 MS Graph API 端点的 put 请求中被接受。
最近的小姐
在这种情况下,prs
是在前面的代码中创建的 Presentation 对象,由于它是 556 行,我没有在这里包含它。
<<Omitted code that generates the Workbook and PowerPoint, of which prs is an output>>
headers = {'Authorization' : 'Bearer {0}'.format(access_token),
'Accept' : 'application/json',
'Content-Type' : 'application/octet-stream'}
endpoint_url = 'https://graph.microsoft.com/v1.0/me/drive/items/<<removed id>>:/Test.pptx:/content'
target_stream = io.BytesIO()
prs.save(target_stream)
response = requests.put(url=endpoint_url,
headers=headers,
data=io.BytesIO.read(target_stream),
verify=False,
params=None)
put 请求成功,但是保存到服务端点的文件是一个空的 pptx shell。我已经排除它prs
本身是一个空的 pptx shell,所以我得出结论,这target_stream
不是prs
.
概括
有人可以通过建议如何将 Presentation 对象prs
转换为我可以插入data=io.BytesIO.read(<<input>>)
并成功上传到 MS Graph API 端点的东西来帮助我吗?我将非常感激!