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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top