2015-05-15 18 views
5

Ho trovato la nota di follow, che descrive esattamente quello che mi piacerebbe fare:Come posso creare un URL di caricamento riassumibile di Google Cloud Storage con Google Client Library per Java su App Engine?

Nota: Se gli utenti sono solo caricando risorse (scrittura) per un secchio di accesso controllato, è possibile utilizzare il funzionalità di caricamento ripristinabile di Google Cloud Storage ed evitare la firma di URL o la richiesta di un account Google. In uno scenario di caricamento ripristinabile, il codice (sul lato server) si autentica e avvia un caricamento su Google Cloud Storage senza caricare effettivamente alcun dato. La richiesta di avvio restituisce un ID di caricamento, che può quindi essere utilizzato in una richiesta client per caricare i dati. La richiesta del client non deve essere firmata perché l'ID di caricamento, in effetti, funge da token di autenticazione. Se scegli questo percorso, assicurati di trasmettere l'ID di caricamento su HTTPS.

https://cloud.google.com/storage/docs/access-control#Signed-URLs

Tuttavia, non riesco a capire come fare questo con l'archiviazione Biblioteca Google Cloud per Java.

https://developers.google.com/resources/api-libraries/documentation/storage/v1/java/latest/

non riesco a trovare alcun riferimento al file recuperabili, o di ottenere l'URL di un file ovunque in questa API. Come posso fare questo?

risposta

4

Quella libreria non espone gli URL che crea al proprio chiamante, il che significa che non è possibile utilizzarlo per ottenere ciò. Se desideri utilizzare gli URL firmati o il trucco che hai menzionato sopra, dovrai implementarlo manualmente.

Vorrei suggerire di andare con la soluzione URL firmata sulla soluzione in cui il server inizializza il caricamento ripristinabile, se possibile. È più flessibile e più semplice da ottenere, e ci sono alcuni casi limite con il secondo metodo che potresti incontrare.

Qualcuno ha scritto un un rapido esempio di firmare un URL da App Engine un po 'indietro in un'altra domanda: Cloud storage and secure download strategy on app engine. GCS acl or blobstore

0

C'è voluto un po' di scavo, ma mi si avvicinò con la seguente, che fa la cosa giusta. Qualche documentazione ufficiale su come eseguire questa operazione sarebbe stata utile, soprattutto perché l'endpoint per l'attivazione effettiva del caricamento ripristinabile è diverso da quello che i documenti chiamano. Ciò che è venuto qui è stato l'utilizzo dello strumento gsutil per firmare le richieste e quindi capire cosa si stava facendo. La cosa aggiuntiva non documentata è che il codice che i POST di questo URL per ottenere un URL di sessione ripristinabile deve includere l'intestazione "x-goog-resumable: start" per attivare il caricamento. Da lì, tutto è uguale ai documenti per eseguire un caricamento ripristinabile su GCS.

import base64 
import datetime 
import time 
import urllib 

from google.appengine.api import app_identity 

SIGNED_URL_EXPIRATION = datetime.timedelta(days=7) 

def SignResumableUploadUrl(gcs_resource_path): 
    """Generates a signed resumable upload URL. 

    Note that documentation on this ability is sketchy. The canonical source 
    is derived from running the gsutil program to generate a RESUMABLE URL 
    with the "-m RESUMABLE" argument. Run "gsutil help signurl" for info and 
    the following for an example: 
    gsutil -m RESUMABLE -d 10m keyfile gs://bucket/file/name 

    Note that this generates a URL different from the standard mechanism for 
    deriving a resumable start URL and the initiator needs to add the header: 
    x-goog-resumable:start 

    Args: 
    gcs_resource_path: The path of the GCS resource, including bucket name. 

    Returns: 
    A full signed URL. 
    """ 
    method = "POST" 
    expiration = datetime.datetime.utcnow() + SIGNED_URL_EXPIRATION 
    expiration = int(time.mktime(expiration.timetuple())) 
    signature_string = "\n".join([ 
     method, 
     "", # content md5 
     "", # content type 
     str(expiration), 
     "x-goog-resumable:start", 
     gcs_resource_path 
    ]) 
    _, signature_bytes = app_identity.sign_blob(signature_string) 
    signature = base64.b64encode(signature_bytes) 

    query_params = { 
     "GoogleAccessId": app_identity.get_service_account_name(), 
     "Expires": str(expiration), 
     "Signature": signature, 
    } 

    return "{endpoint}{resource}?{querystring}".format(
     endpoint="https://storage.googleapis.com", 
     resource=gcs_resource_path, 
     querystring=urllib.urlencode(query_params)) 
+0

Ci scusiamo per aver postato una soluzione python (stavo leggendo un altro post relativo a Python quando cercavo una risposta). Quanto sopra dovrebbe essere abbastanza facile da tradurre in Java, però. –

+0

Stai utilizzando l'ambiente Standard o Flessibile? Sto eseguendo un'applicazione python in EnV flessibile di App Engine e sembra che non abbia un modulo google.appengine ... –

Problemi correlati