Esta página descreve como fazer um pedido de carregamento retomável nas APIs JSON e XML do Cloud Storage. Este protocolo permite-lhe retomar uma operação de carregamento depois de uma falha de comunicação interromper o fluxo de dados.
Para obter informações sobre a utilização de carregamentos retomáveis na CLI Google Cloud e nas bibliotecas de cliente, consulte o artigo Como as ferramentas e as APIs usam carregamentos retomáveis.
Funções necessárias
Para receber as autorizações necessárias para fazer um carregamento retomável, peça ao seu administrador que lhe conceda uma das seguintes funções:
Para carregamentos que incluam um bloqueio de retenção de objetos, peça ao seu administrador para lhe conceder a função de IAM de administrador de objetos de armazenamento (
roles/storage.objectAdmin
) para o contentor.Para todos os outros casos, peça ao administrador que lhe conceda a função de IAM de utilizador do objeto de armazenamento (
roles/storage.objectUser
) para o contentor.
Estas funções predefinidas contêm as autorizações necessárias para carregar um objeto para um contentor para os respetivos casos. Para ver as autorizações exatas necessárias, expanda a secção Autorizações necessárias:
Autorizações necessárias
storage.objects.create
storage.objects.delete
- Esta autorização só é necessária para carregamentos que substituam um objeto existente.
storage.objects.setRetention
- Esta autorização só é necessária para carregamentos que incluam um bloqueio de retenção de objetos.
Também pode obter estas autorizações com outras funções predefinidas ou funções personalizadas.
Para ver informações sobre a concessão de funções em contentores, consulte o artigo Use o IAM com contentores.
Inicie uma sessão de carregamento retomável
Para iniciar uma sessão de carregamento retomável:
API JSON
Ter a CLI gcloud instalada e inicializada, o que lhe permite gerar um token de acesso para o cabeçalho
Authorization
.Opcionalmente, crie um ficheiro JSON que contenha os metadados que quer definir no objeto que está a carregar. Por exemplo, o ficheiro JSON seguinte define os metadados
contentType
do objeto que quer carregar paraimage/png
:{ "contentType": "image/png" }
Use
cURL
para chamar a API JSON com um pedido dePOST
objeto:curl -i -X POST --data-binary @METADATA_LOCATION \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json" \ -H "Content-Length: INITIAL_REQUEST_LENGTH" \ "https://storage.googleapis.com/upload/storage/v1/b/BUCKET_NAME/o?uploadType=resumable&name=OBJECT_NAME"
Onde:
METADATA_LOCATION
é o caminho local para o ficheiro JSON que contém os metadados opcionais especificados no passo anterior. Se não estiver a incluir um ficheiro de metadados, exclua esta opção, juntamente com--data-binary @
e o cabeçalhoContent-Type
.INITIAL_REQUEST_LENGTH
é o número de bytes no corpo deste pedido inicial, por exemplo,79
.BUCKET_NAME
é o nome do contentor para o qual está a carregar o seu objeto. Por exemplo,my-bucket
.OBJECT_NAME
é o nome com codificação URL que quer dar ao objeto. Por exemplo,pets/dog.png
, codificado por URL comopets%2Fdog.png
. Isto não é necessário se tiver incluído umname
no ficheiro de metadados do objeto no passo 2.
Se ativou a partilha de recursos de origem cruzada, também deve incluir um cabeçalho
Origin
neste e nos pedidos de carregamento subsequentes.Os cabeçalhos opcionais que pode adicionar ao pedido incluem
X-Upload-Content-Type
eX-Upload-Content-Length
.Se for bem-sucedido, a resposta inclui um código de estado
200
e tem um aspeto semelhante ao seguinte:HTTP/2 200 content-type: text/plain; charset=utf-8 x-guploader-uploadid: ABgVH8_jqDHM_KOvNAJCx73r9v5fINktk9U-pXana1szCM5803tlJ7CKsRbDxkyYCrfEiNqzcZ6B7DfoDtc-bdzpH-SpVTAMEO9EQV34qG0-0yk location: https://storage.googleapis.com/upload/storage/v1/b/my-bucket/o?uploadType=resumable&name=cat-pic.jpeg&upload_id=ABgVH8_jqDHM_KOvNAJCx73r9v5fINktk9U-pXana1szCM5803tlJ7CKsRbDxkyYCrfEiNqzcZ6B7DfoDtc-bdzpH-SpVTAMEO9EQV34qG0-0yk date: Mon, 07 Jul 2025 14:57:21 GMT vary: Origin vary: X-Origin cache-control: no-cache, no-store, max-age=0, must-revalidate expires: Mon, 01 Jan 1990 00:00:00 GMT pragma: no-cache content-length: 0 server: UploadServer alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
Guarde o URI da sessão retomável indicado no cabeçalho
location
da resposta ao seu pedido de objetoPOST
.Este URI é usado em pedidos subsequentes para carregar os dados do objeto.
API XML
Ter a CLI gcloud instalada e inicializada, o que lhe permite gerar um token de acesso para o cabeçalho
Authorization
.Use
cURL
para chamar a API XML com um pedido dePOST
objeto que tenha um corpo vazio:curl -i -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Length: 0" \ -H "Content-Type: OBJECT_CONTENT_TYPE" \ -H "x-goog-resumable: start" \ "https://storage.googleapis.com/BUCKET_NAME/OBJECT_NAME"
Onde:
OBJECT_CONTENT_TYPE
é o tipo de conteúdo do objeto. Por exemplo,image/png
. Se não especificar um tipo de conteúdo, o sistema do Cloud Storage define os metadadosContent-Type
do objeto comoapplication/octet-stream
.BUCKET_NAME
é o nome do contentor para o qual está a carregar o seu objeto. Por exemplo,my-bucket
.OBJECT_NAME
é o nome com codificação URL que quer dar ao seu objeto. Por exemplo,pets/dog.png
, codificado em URL comopets%2Fdog.png
.
Se ativou a partilha de recursos de origem cruzada, também deve incluir um cabeçalho
Origin
neste e nos pedidos de carregamento subsequentes.Se for bem-sucedido, a resposta inclui uma mensagem de estado
201
.Guarde o URI da sessão retomável indicado no cabeçalho
location
da resposta ao seu pedido de objetoPOST
.Este URI é usado em pedidos subsequentes para carregar os dados do objeto.
Carregue os dados
Depois de iniciar um carregamento retomável, existem duas formas de carregar os dados do objeto:
- Num único bloco: esta abordagem é geralmente a melhor, uma vez que requer menos pedidos e, por isso, tem um melhor desempenho.
- Em vários blocos: use esta abordagem se precisar de reduzir a quantidade de dados transferidos num único pedido, como quando existe um limite de tempo fixo para pedidos individuais ou se não souber o tamanho total do carregamento no momento em que este começa.
Carregamento de fragmento único
Para carregar os dados num único bloco:
API JSON
Use
cURL
para chamar a API JSON com umPUT
pedido de objeto:curl -i -X PUT --data-binary @OBJECT_LOCATION \ -H "Content-Length: OBJECT_SIZE" \ "SESSION_URI"
Onde:
OBJECT_LOCATION
é o caminho local para o seu objeto. Por exemplo,Desktop/dog.png
.OBJECT_SIZE
é o número de bytes no seu objeto. Por exemplo,20000000
.SESSION_URI
é o valor devolvido no cabeçalholocation
quando iniciou o carregamento retomável.
Opcionalmente, pode incluir cabeçalhos com o prefixo
X-Goog-Meta-
para adicionar metadados personalizados para o objeto como parte deste pedido.
API XML
Use
cURL
para chamar a API XML com umPUT
pedido de objeto:curl -i -X PUT --data-binary @OBJECT_LOCATION \ -H "Content-Length: OBJECT_SIZE" \ "SESSION_URI"
Onde:
OBJECT_LOCATION
é o caminho local para o seu objeto. Por exemplo,Desktop/dog.png
.OBJECT_SIZE
é o número de bytes no seu objeto. Por exemplo,20000000
.SESSION_URI
é o valor devolvido no cabeçalhoLocation
quando iniciou o carregamento retomável.
Se o carregamento for concluído na íntegra, recebe uma resposta 200 OK
ou 201 Created
, juntamente com todos os metadados associados ao recurso.
Se o pedido de carregamento for interrompido ou se receber uma resposta 5xx
, siga o procedimento em Retomar um carregamento interrompido.
Carregamento de vários fragmentos
Para carregar os dados em vários blocos:
API JSON
Crie um bloco de dados a partir dos dados gerais que quer carregar.
O tamanho do fragmento deve ser um múltiplo de 256 KiB (256 x 1024 bytes), exceto se for o último fragmento que conclui o carregamento. Normalmente, os tamanhos dos blocos maiores tornam os carregamentos mais rápidos, mas tenha em atenção que existe uma compensação entre a velocidade e a utilização de memória. Recomendamos que use, pelo menos, 8 MiB para o tamanho do fragmento.
Use
cURL
para chamar a API JSON com umPUT
pedido de objeto:curl -i -X PUT --data-binary @CHUNK_LOCATION \ -H "Content-Length: CHUNK_SIZE" \ -H "Content-Range: bytes CHUNK_FIRST_BYTE-CHUNK_LAST_BYTE/TOTAL_OBJECT_SIZE" \ "SESSION_URI"
Onde:
CHUNK_LOCATION
é o caminho local para o fragmento que está a carregar atualmente.CHUNK_SIZE
é o número de bytes que está a carregar no pedido atual. Por exemplo,8388608
.CHUNK_FIRST_BYTE
é o byte inicial no objeto geral que o fragmento que está a carregar contém.CHUNK_LAST_BYTE
é o byte final no objeto geral que o fragmento que está a carregar contém.TOTAL_OBJECT_SIZE
é o tamanho total do objeto que está a carregar. Se não souber o tamanho total do objeto, use*
para este valor.SESSION_URI
é o valor devolvido no cabeçalhoLocation
quando iniciou o carregamento retomável.
Um exemplo de
Content-Range
éContent-Range: bytes 0-8388607/20000000
. ConsulteContent-Range
para mais informações acerca deste cabeçalho.Se o pedido for bem-sucedido, o servidor responde com
308 Resume Incomplete
. A resposta contém um cabeçalhoRange
.Repita os passos acima para cada parte restante dos dados que quer carregar, usando o valor superior contido no cabeçalho
Range
de cada resposta para determinar onde começar cada parte sucessiva. Não deve presumir que o servidor recebeu todos os bytes enviados num determinado pedido.Opcionalmente, no pedido final do carregamento retomável, pode incluir cabeçalhos com o prefixo
X-Goog-Meta-
para adicionar metadados personalizados para o objeto.
API XML
Crie um bloco de dados a partir dos dados gerais que quer carregar.
O tamanho do fragmento deve ser um múltiplo de 256 KiB (256 x 1024 bytes), exceto se for o último fragmento que conclui o carregamento. Normalmente, os tamanhos dos blocos maiores tornam os carregamentos mais rápidos, mas tenha em atenção que existe uma compensação entre a velocidade e a utilização de memória. Recomendamos que use, pelo menos, 8 MiB para o tamanho do fragmento.
Use
cURL
para chamar a API XML com umPUT
pedido de objeto:curl -i -X PUT --data-binary @CHUNK_LOCATION \ -H "Content-Length: CHUNK_SIZE" \ -H "Content-Range: bytes CHUNK_FIRST_BYTE-CHUNK_LAST_BYTE/TOTAL_OBJECT_SIZE" \ "SESSION_URI"
Onde:
CHUNK_LOCATION
é o caminho local para o fragmento que está a carregar atualmente.CHUNK_SIZE
é o número de bytes que está a carregar no pedido atual. Por exemplo,8388608
.CHUNK_FIRST_BYTE
é o byte inicial no objeto geral que o fragmento que está a carregar contém.CHUNK_LAST_BYTE
é o byte final no objeto geral que o fragmento que está a carregar contém.TOTAL_OBJECT_SIZE
é o tamanho total do objeto que está a carregar. Se não souber o tamanho total do objeto, use*
para este valor.SESSION_URI
é o valor devolvido no cabeçalhoLocation
quando iniciou o carregamento retomável.
Um exemplo de
Content-Range
éContent-Range: bytes 0-8388607/20000000
. ConsulteContent-Range
para mais informações acerca deste cabeçalho.Se o pedido for bem-sucedido, o servidor responde com
308 Resume Incomplete
. A resposta contém um cabeçalhoRange
.Repita os passos acima para cada parte restante dos dados que quer carregar, usando o valor superior contido no cabeçalho
Range
de cada resposta para determinar onde começar cada parte sucessiva. Não deve presumir que o servidor recebeu todos os bytes enviados num determinado pedido.
Assim que o carregamento estiver totalmente concluído, recebe uma resposta 200 OK
ou 201 Created
, juntamente com todos os metadados associados ao recurso.
Se algum dos carregamentos de blocos for interrompido ou se receber uma resposta 5xx
, deve reenviar o bloco interrompido na íntegra ou retomar o carregamento interrompido a partir do ponto em que parou.
Verifique o estado de um carregamento retomável
Se o carregamento retomável for interrompido ou não tiver a certeza de que o carregamento foi concluído, pode verificar o estado do carregamento:
API JSON
Use
cURL
para chamar a API JSON com umPUT
pedido de objeto:curl -i -X PUT \ -H "Content-Length: 0" \ -H "Content-Range: bytes */OBJECT_SIZE" \ "SESSION_URI"
Onde:
OBJECT_SIZE
é o número total de bytes no seu objeto. Se não souber o tamanho total do objeto, use*
para este valor.SESSION_URI
é o valor devolvido no cabeçalhoLocation
quando iniciou o carregamento retomável.
API XML
Use
cURL
para chamar a API XML com umPUT
pedido de objeto:curl -i -X PUT \ -H "Content-Length: 0" \ -H "Content-Range: bytes */OBJECT_SIZE" \ "SESSION_URI"
Onde:
OBJECT_SIZE
é o número total de bytes no seu objeto. Se não souber o tamanho total do objeto, use*
para este valor.SESSION_URI
é o valor devolvido no cabeçalhoLocation
quando iniciou o carregamento retomável.
Uma resposta 200 OK
ou 201 Created
indica que o carregamento foi concluído e não é necessária nenhuma ação adicional.
Uma resposta 308 Resume Incomplete
indica que tem de continuar a carregar os dados.
- Se o armazenamento na nuvem ainda não tiver persistido nenhum byte, a resposta
308
não tem um cabeçalhoRange
. Neste caso, deve iniciar o carregamento desde o início. - Caso contrário, a resposta
308
tem um cabeçalhoRange
, que especifica os bytes que o Cloud Storage persistiu até agora. Use este valor quando retomar um carregamento interrompido.
Retome um carregamento interrompido
Se um pedido de carregamento for terminado antes de receber uma resposta ou se receber uma resposta 503
ou 500
, tem de retomar o carregamento interrompido a partir do ponto em que ficou. Para retomar um carregamento interrompido:
API JSON
Verifique o estado do carregamento retomável.
Guarde o valor superior do cabeçalho
Range
contido na resposta à verificação do estado. Se a resposta não tiver um cabeçalhoRange
, o Cloud Storage ainda não persistiu nenhum byte e deve fazer o carregamento desde o início.Certifique-se de que os dados do objeto que está prestes a carregar começam no byte a seguir ao valor superior no cabeçalho
Range
.Se o pedido interrompido continha cabeçalhos com o prefixo
X-Goog-Meta-
, inclua esses cabeçalhos no pedido para retomar o carregamento.Use
cURL
para chamar a API JSON com umPUT
pedido de objeto que é iniciado no byte seguinte ao valor no cabeçalhoRange
:curl -i -X PUT --data-binary @PARTIAL_OBJECT_LOCATION \ -H "Content-Length: UPLOAD_SIZE_REMAINING" \ -H "Content-Range: bytes NEXT_BYTE-LAST_BYTE/TOTAL_OBJECT_SIZE" \ "SESSION_URI"
Onde:
PARTIAL_OBJECT_LOCATION
é o caminho local para a parte restante dos dados que quer carregar.UPLOAD_SIZE_REMAINING
é o número de bytes que está a carregar no pedido atual. Por exemplo, carregar o resto de um objeto com um tamanho total de 20 000 000 que foi interrompido após o carregamento dos bytes 0 a 42 teria umUPLOAD_SIZE_REMAINING
de19999957
.NEXT_BYTE
é o número inteiro seguinte ao valor que guardou no passo 2. Por exemplo, se42
for o valor superior no passo 2, o valor deNEXT_BYTE
é43
.LAST_BYTE
é o byte final contido neste pedidoPUT
. Por exemplo, para concluir o carregamento de um objeto cujo tamanho total é20000000
, o valor deLAST_BYTE
é19999999
.TOTAL_OBJECT_SIZE
é o tamanho total do objeto que está a carregar. Por exemplo,20000000
. Se não souber o tamanho total do objeto, use*
para este valor.SESSION_URI
é o valor devolvido no cabeçalhoLocation
quando iniciou o carregamento retomável.
API XML
Verifique o estado do carregamento retomável.
Guarde o valor superior do cabeçalho
Range
contido na resposta à verificação do estado. Se a resposta não tiver um cabeçalhoRange
, o Cloud Storage ainda não persistiu nenhum byte e deve carregar desde o início.Certifique-se de que os dados do objeto que está prestes a carregar começam no byte a seguir ao valor superior no cabeçalho
Range
.Use
cURL
para chamar a API XML com um pedido de objetoPUT
que é processado no byte a seguir ao valor no cabeçalhoRange
:curl -i -X PUT --data-binary @PARTIAL_OBJECT_LOCATION \ -H "Content-Length: UPLOAD_SIZE_REMAINING" \ -H "Content-Range: bytes NEXT_BYTE-LAST_BYTE/TOTAL_OBJECT_SIZE" \ "SESSION_URI"
Onde:
PARTIAL_OBJECT_LOCATION
é o caminho local para a parte restante dos dados que quer carregar.UPLOAD_SIZE_REMAINING
é o número de bytes que está a carregar no pedido atual. Por exemplo, carregar o resto de um objeto com um tamanho total de 20 000 000 que foi interrompido após o carregamento dos bytes 0 a 42 teria umUPLOAD_SIZE_REMAINING
de19999957
.NEXT_BYTE
é o número inteiro seguinte ao valor que guardou no passo 2. Por exemplo, se42
for o valor superior no passo 2, o valor deNEXT_BYTE
é43
.LAST_BYTE
é o byte final contido neste pedidoPUT
. Por exemplo, para concluir o carregamento de um objeto cujo tamanho total é20000000
, o valor deLAST_BYTE
é19999999
.TOTAL_OBJECT_SIZE
é o tamanho total do objeto que está a carregar. Por exemplo,20000000
. Se não souber o tamanho total do objeto, use*
para este valor.SESSION_URI
é o valor devolvido no cabeçalhoLocation
quando iniciou o carregamento retomável.
Pode retomar os carregamentos as vezes que forem necessárias enquanto o URI da sessão estiver ativo. O URI da sessão expira após uma semana. Quando os dados são carregados com êxito, o Cloud Storage responde com um código de estado 200 OK
ou 201 created
.
Cancele um carregamento
Para cancelar um carregamento retomável incompleto e impedir qualquer ação adicional no mesmo:
API JSON
Use
cURL
para chamar a API JSON com umDELETE
pedido:curl -i -X DELETE -H "Content-Length: 0" \ "SESSION_URI"
Onde:
SESSION_URI
é o valor devolvido no cabeçalhoLocation
quando iniciou o carregamento retomável.
Se for bem-sucedido, a resposta contém um código de estado 499
. As tentativas futuras de consultar ou retomar o carregamento resultam numa resposta 4xx
.
API XML
Use
cURL
para chamar a API XML com umDELETE
pedido:curl -i -X DELETE -H "Content-Length: 0" \ "SESSION_URI"
Onde:
SESSION_URI
é o valor devolvido no cabeçalhoLocation
quando iniciou o carregamento retomável.
Se for bem-sucedido, a resposta contém um código de estado 204
, e as tentativas futuras de consultar ou retomar o carregamento também resultam numa resposta 204
.
Processamento de falhas
Em circunstâncias raras, um pedido para retomar um carregamento interrompido pode falhar com um erro "4xx" não repetível porque as autorizações no contentor foram alteradas ou porque a verificação de integridade no objeto carregado final detetou uma incompatibilidade. Se isto ocorrer, tente novamente o carregamento iniciando uma nova sessão de carregamento retomável.
O que se segue?
- Saiba mais sobre os carregamentos retomáveis.
- Leia uma vista geral da API JSON e da API XML.
- Carregamentos de streams de tamanho desconhecido.
- Envie vários pedidos em lote para a API JSON do Cloud Storage.