我需要在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来说却没有。
答案 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保存文件。