Question

Je dois télécharger un fichier/document sur Google Docs sur une application GAE.Cela devrait être assez simple, mais j'ai beaucoup de problèmes avec l'API.

Le contexte:

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')

Pour télécharger, j'utilise client.Upload(), qui prend un objet MediaSource (wrapper) comme paramètre.Cependant, MediaSource() semble n'accepter qu'un chemin de fichier pour un document : 'C:/Docs/ex.doc'.

Comme je suis sur GAE sans système de fichiers, je ne peux accéder au fichier que via le Blobstore ou une URL directe vers le fichier.Mais comment puis-je saisir cela dans MediaSource()?

Il semble y avoir un façon en Java pour y parvenir en utilisant MediaByteArraySource(), mais rien pour Python.

Était-ce utile?

La solution

Si quelqu'un est curieux, voici comment j'ai résolu ce problème à l'aide de l'API Document List.

Je ne voulais pas utiliser le SDK de lecteur car cela complique beaucoup de choses.C'est beaucoup plus simple avec l'API List de simplement s'authentifier/se connecter sans avoir recours à des astuces OAuth.Ceci utilise la version 2.0.14 du bibliothèque Python gdata, qui n'est pas la version actuelle (2.0.17), mais elle semble avoir un mécanisme de téléchargement plus simple.

Il existe également un peu plus de documentation en ligne (encore rare) pour la version 2.0.14, même si j'ai dû la reconstituer à partir de diverses sources et d'essais et d'erreurs.L'inconvénient est que vous ne pouvez pas télécharger de PDF avec cette version.Ce code Ne fera pas travailler avec 2.0.17.

Voici le code :

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

Autres conseils

La documentation du SDK Google Drive comprend un exemple d'application complet écrit en Python qui s'exécute sur App Engine :

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

Vous pouvez l'utiliser comme référence pour votre implémentation et pour voir comment enregistrer un fichier depuis App Engine.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top