2017-10-10 42 views
0

語境無法從蟒-PPTX庫變換展現對象上傳到MS圖形API服務端點

我有使用openpyxl和python-PPTX庫分別以產生工作簿和PPT工具的Python腳本。這些文件需要通過Microsoft Graph API作爲八位字節流直接從虛擬內存上傳。

障礙

所有工作良好的工作簿得益於save_virtual_workbook方法,它返回一個內存中工作簿;但是我沒有類似的方法,例如我知道的save_virtual_presentation,所以將Presentation對象放在可以通過io.BytesIO.read()方法進行流式處理的表單中一直是一個挑戰。

的python.pptx documentationPresentation.save(file)作品......

「裏file可以是一個文件(字符串)或類似文件的 對象的路徑。」

除了在執行POC時,我沒有保存到本地文件系統的選項,所以我嘗試了使用文件類對象的各種方法。除了下面的嘗試之外,沒有人接近對MS Graph API端點的放入請求。

最近的小姐

在這種情況下,prs是在以前的代碼,我在這裏沒有列入考慮它是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外殼,所以我得出結論target_stream不是prs的有效轉換。

摘要

可有人請通過建議如何將演示文稿對象prs變成東西,我可以插入data=io.BytesIO.read(<<input>>)併成功上傳到MS圖形API端點幫助我嗎?我會非常感激!

+1

使用'data = target_stream.get_value()'有什麼問題?如果io.BytesIO.read甚至是(沒有聽說過它並且無法在文檔中找到它),那麼不應該有任何外部函數的需要。如果你得到的是一個與開始的'python-pptx'「模板」演示文稿一致的空白演示文稿,我會懷疑你的演示文稿生成代碼,就像在最後打開一個新的演示文稿或其他東西。也許你應該至少寫出一個簡單的幻燈片或其他東西的最小數量。 – scanny

+0

'getvalue()'沒有下劃線就行了。千謝謝@scanny! –

回答

1

一切看起來都不錯,直到您讀到BytesIO對象。在撥打put()時,請嘗試使用data=target_stream.getvalue()而不是現在撥打read()。這是將BytesIOStringIO對象的內容作爲字節獲取的常規方式。

+0

這樣做。謝謝,scanny! –

相關問題