Uploads retomáveis

Nesta página, descrevemos como fazer uma solicitação de upload retomável para a API Google Photos Library usando o protocolo REST. Esse protocolo permite retomar uma operação de upload depois que uma falha de comunicação interromper o fluxo de dados.

Se você é um desenvolvedor que usa bibliotecas de cliente, observe que algumas bibliotecas de cliente oferecem suporte nativo para uploads retomáveis.

Use a opção de upload retomável se:

  • Você está fazendo o upload de arquivos grandes.
  • A probabilidade de interrupção de rede ou alguma outra falha de transmissão é alta (por exemplo, se você estiver fazendo upload de um arquivo de um app para dispositivos móveis).

Os uploads retomáveis também podem reduzir o uso da largura de banda quando há uma falha de rede, porque você não precisa reiniciar os uploads de arquivos grandes desde o início.

Etapa 1: iniciar uma sessão de upload

Envie uma solicitação POST para https://photoslibrary.googleapis.com/v1/uploads para iniciar uma sessão de upload retomável. Use o URL de upload retomável retornado nessa solicitação para fazer o upload do arquivo.

A solicitação POST precisa incluir os seguintes cabeçalhos:

Campos de cabeçalho
Content-Length Defina como 0 porque o corpo da solicitação está vazio.
X-Goog-Upload-Command Defina como start.
X-Goog-Upload-Content-Type Defina como o tipo MIME do arquivo, por exemplo, image/jpeg.
X-Goog-Upload-Protocol Defina como resumable.
X-Goog-Upload-Raw-Size Defina como o número total de bytes dos dados do arquivo a serem transferidos.

Este é um cabeçalho de solicitação 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

Etapa 2: salvar o URL da sessão

Se for bem-sucedida, a solicitação POST retornará um código de status HTTP 200 OK, incluindo o cabeçalho a seguir.

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

O campo de cabeçalho x-goog-upload-chunk-granularity contém o alinhamento de bytes e a granularidade de tamanho de todos os blocos de dados enviados pelo cliente. Se o upload for feito em vários fragmentos, todos os uploads, exceto o último, precisam ser feitos em múltiplos desse valor. Ou seja, os bytes de upload do arquivo precisam estar alinhados a esse valor. Na última parte, é possível fazer upload dos bytes restantes.

O campo de cabeçalho X-Goog-Upload-URL contém um URL exclusivo que precisa ser usado para concluir o upload em todas as solicitações restantes. Copie e salve esse URL de sessão retomável para usá-lo nas solicitações subsequentes.

Etapa 3: fazer upload do arquivo

Há duas formas de fazer o upload de um arquivo com uma sessão retomável:

  1. Em uma única solicitação: Em geral, essa abordagem é a melhor, porque requer menos solicitações e, portanto, tem melhor desempenho.
  2. Em várias partes: Nessa abordagem, os uploads são feitos em várias solicitações por agrupamento dos dados. Os dados são divididos em múltiplos de x-goog-upload-chunk-granularity. Se necessário, é possível repetir as solicitações em partes.

    use esta abordagem nos casos a seguir:

    • Você precisa reduzir a quantidade de dados transferidos em uma solicitação única. Talvez seja necessário fazer isso quando houver um limite de tempo fixo para solicitações individuais.
    • você precisar fornecer um indicador personalizado que mostre o progresso do upload;
    • Você precisa saber quando é seguro descartar dados.

Solicitação única

Para fazer upload do arquivo em uma única solicitação, faça o seguinte:

  1. Crie uma solicitação POST para o URL de sessão retomável.
  2. Adicione os dados do arquivo ao corpo da solicitação.
  3. Adicione os cabeçalhos HTTP a seguir:

    • Content-Length: defina como o número de bytes no arquivo.
    • Defina X-Goog-Upload-Command como upload, finalize.
  4. Envie a solicitação.

Se a solicitação de upload for interrompida ou você receber uma resposta 5xx, siga o procedimento em Como retomar um upload interrompido.

Se a solicitação for bem-sucedida, você receberá um código de status HTTP 200 OK e um token de upload no corpo da resposta. Crie o item de mídia usando esse token de upload.

Vários pedaços

Para fazer upload do arquivo em várias partes, faça o seguinte:

  1. Crie uma solicitação POST para o URL de sessão retomável.
  2. Adicione os dados de cada parte ao corpo da solicitação.

    Exceto pelo bloco final que conclui o upload, crie os outros blocos em múltiplos do tamanho aceito de blocos. Mantenha o tamanho do fragmento o maior possível para que o upload seja eficiente.

  3. Adicione os cabeçalhos HTTP a seguir:

    • Content-Length: defina como o número de bytes do bloco.
    • Defina X-Goog-Upload-Command como upload. Para o último fragmento, defina como upload, finalize.
    • X-Goog-Upload-Offset: definido como o deslocamento em que os bytes precisam ser gravados. Observe que o upload dos bytes precisa ser feito em série. O primeiro deslocamento é 0.
  4. Envie a solicitação.

    Se a solicitação de upload for interrompida ou você receber uma resposta 5xx, siga o procedimento em Como retomar um upload interrompido.

  5. Repita as etapas acima para cada fragmento restante no arquivo.

Se a solicitação for bem-sucedida, você receberá um código de status HTTP 200 OK e um token de upload no corpo da resposta. Crie o item de mídia usando esse token de upload.

Exemplo

Solicitação única

O exemplo a seguir mostra uma solicitação retomável para fazer upload de um arquivo JPEG de 3.039.417 bytes em uma única solicitação.

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]

A resposta contém o URL de upload e o tamanho do bloco esperado:

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

A solicitação de upload final:

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]

Vários pedaços

O exemplo a seguir mostra uma solicitação retomável para fazer upload de um arquivo JPEG de 3.039.417 bytes em vários blocos, usando o URL de sessão retomável e a granularidade de tamanho de parte aceita, recebida na etapa anterior. Este exemplo usa um tamanho de bloco de 262.144 bytes que foi retornado no campo de cabeçalho, x-goog-upload-chunk-granularity, quando a sessão de upload foi inicializada. Cada upload contém bytes que estão em múltiplos de 262.144.

Inicialize a sessão de upload para receber o URL de upload e o tamanho do bloco, conforme descrito na etapa anterior:

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]

A resposta contém o URL de upload e o tamanho do bloco esperado:

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

Primeiro bloco:

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]

Segunda parte:

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]

Último bloco:

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]

Como retomar um upload interrompido

Se a solicitação de upload for interrompida ou se você receber um código de status HTTP que não seja 200, consulte o servidor para descobrir quanto do upload foi bem-sucedido.

Esta é uma solicitação POST para o URL de sessão retomável. X-Goog-Upload-Command precisa ser definido como 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

A resposta do servidor inclui um código de status HTTP 200 OK e o tamanho atual do upload.

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

Assim, você poderá retomar o envio nesse deslocamento. É preciso retomar no deslocamento fornecido pelo servidor, a menos que você envie um comando combinado de upload e finalização. Nesse caso, também é possível retomar no deslocamento 0.

Se o cabeçalho X-Goog-Upload-Status na resposta HTTP do seu comando de consulta estiver presente e o valor não for active, isso indica que o upload já foi encerrado.