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