Upload do Python GAE para o Google Docs
-
11-12-2019 - |
Pergunta
Preciso fazer upload de um arquivo/documento para o Google Docs em um aplicativo GAE.Isso deve ser bastante simples, mas estou tendo muitos problemas com a API.
O contexto:
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')
Para fazer upload estou usando client.Upload()
, que usa um objeto MediaSource (wrapper) como parâmetro.No entanto, MediaSource()
parece aceitar apenas um caminho de arquivo para um documento: 'C:/Docs/ex.doc'
.
Como estou no GAE sem sistema de arquivos, só posso acessar o arquivo por meio do Blobstore ou de uma URL direta para o arquivo.Mas como faço para inserir isso em MediaSource()
?
Parece haver um caminho em Java para fazer isso usando MediaByteArraySource()
, mas nada para Python.
Solução
Se alguém estiver curioso, veja como resolvi esse problema usando a API Document List.
eu não queria usar o Drive SDK já que complica muitas coisas.É muito mais simples com a API List apenas autenticar/fazer login sem a necessidade de alguns truques do OAuth.Isso está usando a versão 2.0.14 do biblioteca Python gdata, que não é a versão atual (2.0.17), mas parece ter um mecanismo de upload mais simples.
Há também um pouco mais de documentação online (ainda escassa) para 2.0.14, embora eu tenha que juntar isso a partir de várias fontes e tentativa e erro.A desvantagem é que você não pode fazer upload de PDFs com esta versão.Este código não vou trabalhe com 2.0.17.
Aqui está o código:
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
Outras dicas
A documentação do SDK do Google Drive inclui um aplicativo de amostra completo escrito em Python que é executado no App Engine:
https://developers.google.com/drive/examples/python
Você pode usá-lo como referência para sua implementação e para ver como salvar um arquivo do App Engine.