Python GAE上传到Google文档

时间:2012-09-30 21:29:01

标签: python google-app-engine google-drive-api google-docs-api

我需要在GAE应用程序上将文件/文档上传到Google文档。这应该很简单,但我在使用API​​时遇到了很多麻烦。

背景信息:

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()

使用MediaByteArraySource()似乎有way in Java来完成此任务,但对于Python来说却没有。

2 个答案:

答案 0 :(得分:1)

如果有人好奇,请问我是如何使用文档列表API解决此问题的。

我不想使用Drive SDK,因为它确实使很多事情变得复杂。使用List API进行身份验证/登录更加简单,而无需使用某些OAuth技巧。这是使用gdata Python library的版本2.0.14,它不是当前版本(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

答案 1 :(得分:0)

Google Drive SDK文档包含一个用Python编写的完整示例应用程序,可在App Engine上运行:

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

您可以将其用作实施的参考,并了解如何从App Engine保存文件。