3

我需要在 GAE 应用程序上将文件/文档上传到 Google Docs。这应该很简单,但是我在使用 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()呢?

Java中似乎有一种方法可以通过使用来完成此操作MediaByteArraySource(),但对于 Python 则没有。

4

2 回答 2

1

如果有人好奇,这里是我使用文档列表 API 解决这个问题的方法。

我不想使用Drive SDK,因为它确实使很多事情复杂化。使用 List API 进行身份验证/登录要简单得多,而不需要一些 OAuth 技巧。这里使用的是gdata Python 库的 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
于 2012-10-03T01:29:30.043 回答
0

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

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

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

于 2012-09-30T23:36:48.670 回答