Domanda

Ho bisogno di caricare un file / documento su Google Docs su un'applicazione GAE.Questo dovrebbe essere abbastanza semplice, ma sto avendo un sacco di problemi con l'API.

Il contesto:

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

Per caricare Sto usando client.Upload(), che prende un oggetto MediaSource (wrapper) come parametro.Tuttavia, MediaSource() sembra accettare solo un filepath per un documento: 'C:/Docs/ex.doc'.

Poiché sono su GAE senza filesystem, posso solo accedere al file attraverso il Blobstore o un URL diretto al file.Ma come posso inserirlo in MediaSource()?

Sembra che ci sia un Modo in Java per realizzare questo usando MediaByteArraySource(), ma niente per Python.

È stato utile?

Soluzione

Se qualcuno è curioso, ecco come ho risolto questo problema utilizzando l'API dell'elenco documenti.

Non volevo usare il Drive sdk poiché complica un sacco di cose.È molto più semplice con l'API dell'elenco per autenticarsi / accedere solo senza la necessità di un inganno di OAuth.Questo utilizza la versione 2.0.14 del GData Python Library ,Quale non è la versione corrente (2.0.17), ma sembra avere un meccanismo di caricamento più semplice.

C'è anche una documentazione leggermente più (ancora sparsa) online per 2.0.14, anche se ho dovuto piegarmi insieme da varie fonti e prova ed errore.Il ribasso è che non puoi caricare PDF con questa versione.Questo codice non funziona con 2.0.17.

Ecco il codice:

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
.

Altri suggerimenti

I Documenti di Google Drive SDK includono un'applicazione di esempio completa scritta in Python che funziona su APP Engine:

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

Puoi usarlo come riferimento per la tua implementazione e per vedere come salvare un file dal motore dell'app.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top