我需要上传一个文件/文档到一个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()
?似乎有一个way in Java可以通过使用
MediaByteArraySource()
来实现这一点,但是对于Python来说没有。 最佳答案
如果有人好奇,下面是我如何使用文档列表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