3

我需要在GAE應用程序上將文件/文檔上傳到Google文檔。這應該很簡單,但我在API中遇到了很多麻煩。Python GAE上傳到Google文檔

上下文:

import gdata.docs.service 

client = gdata.docs.service.DocsService() 
client.ClientLogin('gmail', 'pass') 

ms = gdata.MediaSource(#what goes in here?) 
client.Upload(media_source=ms, title='title') 

要上傳我使用client.Upload(),這需要一個MediaSource的(包裝器)對象作爲參數。但是,MediaSource()似乎只接受文檔的文件路徑:'C:/Docs/ex.doc'

由於我在沒有文件系統的GAE上,我只能通過Blobstore或文件的直接URL訪問文件。但是,我怎麼輸入MediaSource()

似乎有way in Java通過使用MediaByteArraySource()來完成此操作,但對Python沒有任何幫助。

+0

[MediaIoBaseUpload](https://google-api-python-client.googlecode.com/hg/docs/epy/apiclient.http.MediaIoBaseUpload-class.html) [用於Python的Google API客戶端庫](http://code.google.com/p/google-api-python-client/)似乎能夠從流中執行上傳。 –

+0

嗯,這是如何與gdata模塊一起工作的?這似乎完全分開。 – kennysong

+0

我相信這是目前推薦用於訪問Google API的Python模塊,您可以在[此處](https://developers.google.com/api-client-library/python/start/installation)中看到。 –

回答

1

如果有人很好奇,下面是我如何使用文檔列表API解決這個問題。

我不想使用Drive SDK,因爲它確實使很多事情變得複雜。 List API更簡單,只需進行身份驗證/登錄,而不需要某些OAuth欺騙。這是使用版本2.0.14的gdata Python library,這不是當前版本(2.0.17),但它似乎有一個更簡單的上載機制。

在2.0.14上還有一些略多(仍然稀疏)的文檔,雖然我不得不將這件作品拼湊成各種來源和試用&錯誤。缺點是你不能用這個版本上傳pdf。此代碼不會與2.0.17一起使用。

下面的代碼:

import gdata.docs.service 
import gdata.docs.data 
from google.appengine.api import urlfetch 

# get file from url 
result = urlfetch.fetch('http://example.com/test.docx') 
headers = result.headers 
data = result.content 

# authenticate client object 
client = gdata.docs.service.DocsService() 
client.ClientLogin('gmail', 'password') 

# create MediaSource file wrapper 
ms = gdata.MediaSource(file_handle=result.content, 
content_type=headers['content-type'], 
content_length=int(headers['content-length'])) 

# upload specific folder, return URL of doc 
google_doc_name = 'title' 
folder_uri = '/feeds/folders/private/full/folder:j7XO8SJj...' 
entry = client.Upload(ms, google_doc_name, folder_or_uri=secret.G_FOLDER_URI) 
edit_url = entry.GetAlternateLink().href 
0

的谷歌驅動器SDK文檔包括用Python編寫的一個完整的示例應用程序在App Engine上運行:

https://developers.google.com/drive/examples/python

您可以使用它作爲您的實現參考,並請參閱如何從保存文件App Engine。

+0

我上面評論過,但我使用的是文檔列表API。我之前查看過Drive SDK,但似乎沒有指出Google文檔和任意Drive文件之間的區別。另外,有沒有辦法上傳到Doc List API中的ClientLogin()這樣的預定義帳戶?它似乎只在認證後上傳到用戶的Google帳戶(應該沒有認證)。 – kennysong

+0

您可以將任何類型的文件上傳到雲端硬盤,並使用?convert查詢參數來控制是將其保存爲文件還是將其轉換爲相應的Google文檔格式。沒有ClientLogin的替代方案,因爲它是不是一個安全的想法,要求用戶名和密碼 –

+1

看到我上面的評論重新GDocs文件上傳。在下載時,您可以檢查mime類型以確定該文件是否爲Gdocs文件。如果您遵循OAuth流程,您最終將獲得綁定到用戶帳戶的訪問令牌。我不確定你的意思是「不應該進行身份驗證」,因爲這肯定是必須的。有許多不同的OAuth流程。可能有一個會滿足您的需求。 – pinoyyid