Вопрос

Мне нужно загрузить файл/документ в Документы Google в приложении GAE.Это должно быть достаточно просто, но у меня большие проблемы с 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(), но ничего для Python.

Это было полезно?

Решение

Если кому-то интересно, вот как я решил эту проблему с помощью API списка документов.

Я не хотел использовать SDK Диска так как это многое усложняет.С помощью List API гораздо проще просто пройти аутентификацию/вход без необходимости каких-либо ухищрений OAuth.Используется версия 2.0.14 библиотека Python для gdata, который не является текущей версией (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

Другие советы

Документация Google Drive SDK включает полный пример приложения, написанного на Python и работающего на App Engine:

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

Вы можете использовать его в качестве справочного материала для своей реализации и узнать, как сохранить файл из App Engine.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top