0

语境

我有一个 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 端点的东西来帮助我吗?我将非常感激!

4

1 回答 1

1

一切看起来都不错,直到您阅读该BytesIO对象。在put()通话中,尝试使用data=target_stream.getvalue()而不是read()您现在的通话。BytesIO这是将 a或StringIO对象的内容作为字节获取的常规方法。

于 2017-10-10T19:16:26.057 回答