Frage

Ich muss eine Datei / ein Dokument in einer GAE-Anwendung in Google Text & Tabellen hochladen.Das sollte einfach genug sein, aber ich habe große Probleme mit der API.

Kontext:

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

Zum Hochladen benutze ich client.Upload(), das ein MediaSource (Wrapper) -Objekt als Parameter verwendet.Jedoch, MediaSource() scheint nur einen Dateipfad für ein Dokument zu akzeptieren: 'C:/Docs/ex.doc'.

Da ich auf GAE ohne Dateisystem bin, kann ich nur über den Blobstore oder eine direkte URL zur Datei auf die Datei zugreifen.Aber wie gebe ich das ein MediaSource()?

Es scheint eine zu geben weg in Java um dies zu erreichen, verwenden Sie MediaByteArraySource(), aber nichts für Python.

War es hilfreich?

Lösung

Wenn jemand neugierig ist, hier ist, wie ich dieses Problem mit der Dokumentenlisten-API gelöst habe.

Ich wollte das nicht benutzen Laufwerks-SDK da es viele Dinge kompliziert.Mit der Listen-API ist es viel einfacher, sich einfach zu authentifizieren / anzumelden, ohne dass OAuth-Tricks erforderlich sind.Dies verwendet Version 2.0.14 des gdata Python-Bibliothek, was nicht die aktuelle Version (2.0.17) ist, aber es scheint einen einfacheren Upload-Mechanismus zu haben.

Es gibt auch etwas mehr (noch spärliche) Dokumentation online für 2.0.14, obwohl ich dies aus verschiedenen Quellen und Versuch und Irrtum zusammenstellen musste.Der Nachteil ist, dass Sie mit dieser Version keine PDFs hochladen können.Dieser Code wird nicht arbeite mit 2.0.17.

Hier ist der 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

Andere Tipps

Die Google Drive SDK-Dokumente enthalten eine vollständige Beispielanwendung, die in Python geschrieben ist und auf App Engine ausgeführt wird:

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

Sie können es als Referenz für Ihre Implementierung verwenden und sehen, wie Sie eine Datei aus App Engine speichern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top