【问题标题】:Python GAE upload to Google DocsPython GAE 上传到 Google Docs
【发布时间】:2012-09-21 19:55:41
【问题描述】:

我需要在 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()

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

【问题讨论】:

  • MediaIoBaseUploadGoogle APIs Client Library for Python 似乎能够从流中执行上传。
  • 嗯,这如何与 gdata 模块一起使用?这似乎完全分开。
  • 我相信这是目前推荐用于访问 Google API 的 Python 模块,如您所见 here
  • 我认为你现在应该使用 Google Drive APIs
  • Drive API 与文件类型无关。如果 (a) 源文件具有可识别的、兼容的 mime 类型(例如“text/html”)并且使用“convert=true”完成上传,则结果将是 Gdocs 文件。

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


【解决方案1】:

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

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

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

【讨论】:

  • 我在上面评论过,但我使用的是文档列表 API。我之前看过 Drive SDK,但它似乎没有指定 Google 文档和任意 Drive 文件之间的区别。此外,有没有办法上传到文档列表 API 中的 ClientLogin() 等预定义帐户?好像认证后才上传到用户的谷歌账号(应该没有认证)。
  • 您可以将任何类型的文件上传到云端硬盘并使用 ?convert 查询参数来控制是将其保留为文件还是将其转换为相应的 Google Docs 格式。没有 ClientLogin 替代方案,因为要求用户名和密码并不安全
  • 在上传时查看我上面关于 GDocs 文件的评论。下载时,您可以检查 mime 类型以确定文件是否为 Gdocs 文件。如果您遵循 OAuth 流程,您最终会得到一个绑定到用户帐户的访问令牌。我不确定您所说的“不应该进行身份验证”是什么意思,因为显然必须有。有许多不同的 OAuth 流程。可能有一个可以满足您的需求。
  • 啊,我的意思是用户不应该验证任何东西;身份验证应完全在后端完成,如 ClientLogin()。因此,GAE webapp 的任何用户都应该能够上传发送到 my Drive 的文件。这可能吗?
【解决方案2】:

如果有人好奇,下面是我使用文档列表 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

【讨论】:

    猜你喜欢
    • 2011-04-29
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 2012-06-17
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    相关资源
    最近更新 更多