Caricamenti ripristinabili

In questa pagina viene descritto come effettuare una richiesta di caricamento ripristinabile all'API Raccolta di Google Foto. tramite il protocollo REST. Questo protocollo consente di riprendere un'operazione di caricamento dopo che un errore di comunicazione interrompe il flusso di dati.

Utilizza l'opzione di caricamento ripristinabile se:

  • Stai caricando file di grandi dimensioni.
  • La probabilità di interruzione della rete o di un altro errore di trasmissione è elevata (ad esempio, se carichi un file da un'app mobile).

I caricamenti ripristinabili possono anche ridurre l'utilizzo della larghezza di banda in presenza di una rete in quanto non è necessario riavviare i caricamenti di file di grandi dimensioni partendo da zero.

Passaggio 1: avvio di una sessione di caricamento

Avvia una sessione di caricamento ripristinabile inviando una richiesta POST a https://photoslibrary.googleapis.com/v1/uploads. Utilizzo del caricamento ripristinabile URL restituito in questa richiesta, carica il file.

La richiesta POST deve includere le seguenti intestazioni:

Campi intestazione
Content-Length Impostato su 0 perché il corpo della richiesta è vuoto.
X-Goog-Upload-Command Da impostare su start.
X-Goog-Upload-Content-Type Impostato sul tipo MIME del file, ad esempio image/jpeg.
X-Goog-Upload-Protocol Da impostare su resumable.
X-Goog-Upload-Raw-Size Imposta il numero totale di byte dei dati del file da trasferire.

Ecco un'intestazione della richiesta POST:

POST https://photoslibrary.googleapis.com/v1/uploads
Authorization: Bearer oauth2-token
Content-Length: 0
X-Goog-Upload-Command: start
X-Goog-Upload-Content-Type: mime-type
X-Goog-Upload-Protocol: resumable
X-Goog-Upload-Raw-Size: bytes-of-file

Passaggio 2: salva l'URL della sessione

Se la richiesta va a buon fine, restituisce un codice di stato HTTP 200 OK, incluso la seguente intestazione.

X-Goog-Upload-URL: url-to-make-uploads-to
X-Goog-Upload-Chunk-Granularity: chunk-granularity-in-bytes

Il campo di intestazione x-goog-upload-chunk-granularity contiene l'allineamento dei byte e granularità delle dimensioni per tutti i blocchi di dati inviati dal client. Se il caricamento è eseguita in più blocchi, tutti i caricamenti, tranne l'ultimo, deve essere eseguita in multipli di questo valore. In altre parole, i byte di caricamento del file devono essere allineati a questo valore. Nell'ultimo chunk puoi caricare i byte rimanenti.

Il campo dell'intestazione X-Goog-Upload-URL contiene un URL univoco che deve essere utilizzato per completare il caricamento tramite tutte le richieste rimanenti. Copia e salva questo URL sessione riassumibile, in modo da poterlo utilizzare per le richieste successive.

Passaggio 3: carica il file

Esistono due modi per caricare un file con una sessione riavviabile:

  1. In una singola richiesta. Questo approccio è di solito il migliore, perché richiede meno richieste e, di conseguenza, ha prestazioni migliori.
  2. In più blocchi. Con questo approccio, i caricamenti vengono effettuati in più richieste, suddividendo i dati. I dati vengono suddivisi in multipli di x-goog-upload-chunk-granularity. Se necessario, le richieste suddivise in blocchi possono essere riprovate.

    Utilizza questo approccio se:

    • Devi ridurre la quantità di dati trasferiti in ogni singola richiesta. Potresti dover eseguire questa operazione quando è previsto un limite di tempo fisso per le singole richieste.
    • Devi fornire un indicatore personalizzato che mostri lo stato di avanzamento del caricamento.
    • Devi sapere quando è sicuro eliminare i dati.

Richiesta singola

Per caricare il file in una singola richiesta:

  1. Crea una richiesta POST all'URL della sessione riassumibile.
  2. Aggiungi i dati del file al corpo della richiesta.
  3. Aggiungi le seguenti intestazioni HTTP:

    • Content-Length: impostato sul numero di byte nel file.
    • X-Goog-Upload-Command: impostata su upload, finalize.
  4. Invia la richiesta.

Se la richiesta di caricamento viene interrotta o ricevi una risposta 5xx , segui la procedura descritta in Riprendere un caricamento interrotto.

Se la richiesta ha esito positivo, ricevi uno stato HTTP 200 OK e un token di caricamento nel corpo della risposta. Crea l'elemento multimediale utilizzando questo token di caricamento.

Più chunk

Per caricare il file in più parti:

  1. Crea una richiesta POST all'URL della sessione riassumibile.
  2. Aggiungi i dati del chunk al corpo della richiesta.

    Fatta eccezione per il blocco finale che completa il caricamento, crea di altri blocchi in multipli delle dimensioni accettate. Mantieni la dimensione del chunk il più grande possibile per un caricamento efficiente.

  3. Aggiungi le seguenti intestazioni HTTP:

    • Content-Length: impostato sul numero di byte nella un blocco note.
    • X-Goog-Upload-Command: impostato su upload. Per l'ultimo chunk, imposta upload, finalize.
    • X-Goog-Upload-Offset: viene impostato sull'offset in cui si trova devono essere scritti. Tieni presente che i byte devono essere caricati in sequenza. Il primo offset è 0.
  4. Invia la richiesta.

    Se la richiesta di caricamento viene interrotta o ricevi una risposta 5xx , segui la procedura descritta in Riprendere un caricamento interrotto.

  5. Ripeti questi passaggi per ogni chunk rimanente nel file.

Se la richiesta riesce, ricevi un codice di stato HTTP 200 OK e un token di caricamento nel corpo della risposta. Crea l'elemento multimediale utilizzando questo token di caricamento.

Esempio

Richiesta singola

L'esempio seguente mostra una richiesta riprendente per il caricamento di un file JPEG di 3.039.417 byte in una singola richiesta.

POST https://photoslibrary.googleapis.com/v1/uploads HTTP/1.1
Content-Length: 0
X-Goog-Upload-Command: start
X-Goog-Upload-Content-Type: image/jpeg
X-Goog-Upload-Protocol: resumable
X-Goog-Upload-Raw-Size: 3039417
[no body]

La risposta contiene l'URL di caricamento e la dimensione del blocco prevista:

HTTP/1.1 200 OK
X-Goog-Upload-URL: https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable
X-Goog-Upload-Chunk-Granularity: 262144

Richiesta di caricamento finale:

POST https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable HTTP/1.1
Content-Length: 3039417
X-Goog-Upload-Command: upload, finalize
X-Goog-Upload-Offset: 0

[BYTES 0-4199999]

Più chunk

L'esempio seguente mostra una richiesta riprendente per il caricamento di un file JPEG di 3039417 byte in più chunk, utilizzando l'URL della sessione riprendente e la granularità delle dimensioni dei chunk accettate ottenuta nel passaggio precedente. Questo esempio utilizza una dimensione del chunk di 262.144 byte restituita nel campo dell'intestazione x-goog-upload-chunk-granularity quando è stata inizializzata la sessione di caricamento. Tieni presente che ogni caricamento contiene byte sono in multipli di 262.144.

Inizializza la sessione di caricamento per ricevere l'URL di caricamento e la dimensione del blocco come descritto nel passaggio precedente:

POST https://photoslibrary.googleapis.com/v1/uploads HTTP/1.1
Content-Length: 0
X-Goog-Upload-Command: start
X-Goog-Upload-Content-Type: image/jpeg
X-Goog-Upload-Protocol: resumable
X-Goog-Upload-Raw-Size: 3039417
[no body]

La risposta contiene l'URL di caricamento e la dimensione del blocco prevista:

HTTP/1.1 200 OK
X-Goog-Upload-URL: https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable
X-Goog-Upload-Chunk-Granularity: 262144

Primo blocco:

POST https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable HTTP/1.1
Content-Length: 1048576
X-Goog-Upload-Command: upload
X-Goog-Upload-Offset: 0

[BYTES 0-1048575]

Secondo chunk:

POST https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable HTTP/1.1
Content-Length: 1048576
X-Goog-Upload-Command: upload
X-Goog-Upload-Offset: 1048576

[BYTES 1048576-2097151]

Ultimo chunk:

POST https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable HTTP/1.1
Content-Length: 942265
X-Goog-Upload-Command: upload, finalize
X-Goog-Upload-Offset: 2097152

[BYTES 2097152-4200000]

Riprendere un caricamento interrotto

Se la richiesta di caricamento viene interrotta o se ricevi uno stato HTTP diverso da 200 esegui una query sul server per scoprire il numero di caricamenti riusciti.

Ecco una richiesta POST all'URL della sessione riassumibile. X-Goog-Upload-Command deve essere impostato su query.

POST https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable HTTP/1.1
Content-Length: 0
X-Goog-Upload-Command: query

La risposta dal server include un codice di stato HTTP 200 OK e il dimensioni correnti del caricamento.

HTTP/1.1 200 OK
X-Goog-Upload-Status: active
X-Goog-Upload-Size-Received: 100

A questo punto puoi riprendere il caricamento. Devi riprendere dall'offset fornito dal server, a meno che non invii un comando combinato di caricamento e finalizzazione, nel qual caso puoi anche riprendere dall'offset 0.

Se l'intestazione X-Goog-Upload-Status nella risposta HTTP del comando di query è presente e il valore non è active, significa che il caricamento è già stato terminato.