Questa pagina descrive come effettuare una richiesta di caricamento ripristinabile nelle API Cloud Storage JSON e XML. Questo protocollo consente di riprendere un'operazione di caricamento dopo che un errore di comunicazione interrompe il flusso di dati.
Per informazioni sull'utilizzo dei caricamenti ripristinabili in Google Cloud CLI e nelle librerie client, consulta In che modo gli strumenti e le API utilizzano i caricamenti ripristinabili.
Ruoli obbligatori
Per ottenere le autorizzazioni necessarie per eseguire un caricamento ripristinabile, chiedi all'amministratore di concederti uno dei seguenti ruoli:
Per i caricamenti che includono un blocco della conservazione degli oggetti, chiedi all'amministratore di concederti il ruolo IAM Amministratore oggetti Storage (
roles/storage.objectAdmin) per il bucket.Per tutti gli altri casi, chiedi all'amministratore di concederti il ruolo IAM Utente oggetti Storage (
roles/storage.objectUser) per il bucket.
Questi ruoli predefiniti contengono le autorizzazioni necessarie per caricare un oggetto in un bucket per i rispettivi casi. Per vedere quali sono esattamente le autorizzazioni richieste, espandi la sezione Autorizzazioni obbligatorie:
Autorizzazioni obbligatorie
storage.objects.createstorage.objects.delete- Questa autorizzazione è necessaria solo per i caricamenti che sovrascrivono un oggetto esistente.
storage.objects.setRetention- Questa autorizzazione è obbligatoria solo per i caricamenti che includono un blocco della conservazione degli oggetti.
Puoi anche ottenere queste autorizzazioni con altri ruoli predefiniti o ruoli personalizzati.
Per informazioni sulla concessione dei ruoli sui bucket, consulta Impostare e gestire le policy IAM sui bucket.
Avviare una sessione di caricamento ripristinabile
Per avviare una sessione di caricamento ripristinabile:
API JSON
Avere gcloud CLI installata e inizializzata, il che ti consente di generare un token di accesso per l'intestazione
Authorization.(Facoltativo) Crea un file JSON contenente i metadati che vuoi impostare sull'oggetto che stai caricando. Ad esempio, il seguente file JSON imposta i metadati
contentTypedell'oggetto che vuoi caricare suimage/png:{ "contentType": "image/png" }Utilizza
cURLper chiamare l'API JSON con una richiesta diPOSToggetto: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"Dove:
METADATA_LOCATIONè il percorso locale del file JSON contenente i metadati facoltativi specificati nel passaggio precedente. Se non includi un file di metadati, escludi questo elemento, insieme a--data-binary @e all'intestazioneContent-Type.INITIAL_REQUEST_LENGTHè il numero di byte nel corpo di questa richiesta iniziale, ad esempio79.BUCKET_NAMEè il nome del bucket in cui carichi l'oggetto. Ad esempio,my-bucket.OBJECT_NAMEè il nome con codifica URL che vuoi assegnare all'oggetto. Ad esempio,pets/dog.png, codificato come URLpets%2Fdog.png. Questo passaggio non è obbligatorio se hai incluso unnamenel file dei metadati dell'oggetto nel passaggio 2.
Se hai abilitato la condivisione delle risorse tra origini, devi anche includere un'intestazione
Originin questa e nelle successive richieste di caricamento.Le intestazioni facoltative che puoi aggiungere alla richiesta includono
X-Upload-Content-TypeeX-Upload-Content-Length.In caso di esito positivo, la risposta include un codice di stato
200e ha un aspetto simile al seguente: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
Salva l'URI della sessione ripristinabile fornito nell'intestazione
locationdella risposta alla richiesta dell'oggettoPOST.Questo URI viene utilizzato nelle richieste successive per caricare i dati dell'oggetto.
API XML
Avere gcloud CLI installata e inizializzata, il che ti consente di generare un token di accesso per l'intestazione
Authorization.Utilizza
cURLper chiamare l'API XML con una richiestaPOSTObject che ha un corpo vuoto: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"Dove:
OBJECT_CONTENT_TYPEè il tipo di contenuto dell'oggetto. Ad esempio:image/png. Se non specifichi un tipo di contenuti, il sistema Cloud Storage imposta i metadatiContent-Typeper l'oggetto suapplication/octet-stream.BUCKET_NAMEè il nome del bucket in cui carichi l'oggetto. Ad esempio,my-bucket.OBJECT_NAMEè il nome con codifica URL che vuoi assegnare all'oggetto. Ad esempio,pets/dog.png, codificato come URL comepets%2Fdog.png.
Se hai abilitato la condivisione delle risorse tra origini, devi anche includere un'intestazione
Originin questa e nelle successive richieste di caricamento.In caso di esito positivo, la risposta include un messaggio di stato
201.Salva l'URI della sessione ripristinabile fornito nell'intestazione
locationdella risposta alla richiesta dell'oggettoPOST.Questo URI viene utilizzato nelle richieste successive per caricare i dati dell'oggetto.
Carica i dati
Una volta avviato un caricamento ripristinabile, esistono due modi per caricare i dati dell'oggetto:
- In un unico blocco: questo approccio è in genere il migliore, poiché richiede meno richieste e quindi offre un rendimento migliore.
- In più blocchi: utilizza questo approccio se devi ridurre la quantità di dati trasferiti in una singola richiesta, ad esempio quando è presente un limite di tempo fisso per le singole richieste o se non conosci le dimensioni totali del caricamento al momento dell'inizio.
Caricamento di un singolo blocco
Per caricare i dati in un unico blocco:
API JSON
Utilizza
cURLper chiamare l'API JSON con una richiesta di oggettoPUT:curl -i -X PUT --data-binary @OBJECT_LOCATION \ -H "Content-Length: OBJECT_SIZE" \ "SESSION_URI"Dove:
OBJECT_LOCATIONè il percorso locale dell'oggetto. Ad esempio,Desktop/dog.png.OBJECT_SIZEè il numero di byte nell'oggetto. Ad esempio,20000000.SESSION_URIè il valore restituito nell'intestazionelocationquando hai avviato il caricamento ripristinabile.
Se vuoi, puoi includere intestazioni con il prefisso
X-Goog-Meta-per aggiungere metadati personalizzati per l'oggetto nell'ambito di questa richiesta.
API XML
Utilizza
cURLper chiamare l'API XML con una richiesta di oggettoPUT:curl -i -X PUT --data-binary @OBJECT_LOCATION \ -H "Content-Length: OBJECT_SIZE" \ "SESSION_URI"Dove:
OBJECT_LOCATIONè il percorso locale dell'oggetto. Ad esempio,Desktop/dog.png.OBJECT_SIZEè il numero di byte nell'oggetto. Ad esempio,20000000.SESSION_URIè il valore restituito nell'intestazioneLocationquando hai avviato il caricamento ripristinabile.
Se il caricamento viene completato interamente, ricevi una risposta 200 OK o 201 Created, insieme a tutti i metadati associati alla risorsa.
Se la richiesta di caricamento viene interrotta o se ricevi una risposta 5xx,
segui la procedura descritta in Riprendere un caricamento interrotto.
Caricamento di più segmenti
Per caricare i dati in più blocchi:
API JSON
Crea un blocco di dati a partire dai dati complessivi che vuoi caricare.
La dimensione del chunk deve essere un multiplo di 256 KiB (256 x 1024 byte), a meno che non si tratti dell'ultimo chunk che completa il caricamento. Dimensioni dei chunk più grandi in genere velocizzano i caricamenti, ma tieni presente che esiste un compromesso tra velocità e utilizzo della memoria. Ti consigliamo di utilizzare almeno 8 MiB per le dimensioni del chunk.
Utilizza
cURLper chiamare l'API JSON con una richiesta di oggettoPUT: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"Dove:
CHUNK_LOCATIONè il percorso locale del chunk che stai caricando.CHUNK_SIZEè il numero di byte che stai caricando nella richiesta corrente. Ad esempio,8388608.CHUNK_FIRST_BYTEè il byte iniziale dell'oggetto complessivo contenuto nel chunk che stai caricando.CHUNK_LAST_BYTEè il byte finale dell'oggetto complessivo che contiene il chunk che stai caricando.TOTAL_OBJECT_SIZEè la dimensione totale dell'oggetto che stai caricando. Se non conosci le dimensioni complete dell'oggetto, utilizza*per questo valore.SESSION_URIè il valore restituito nell'intestazioneLocationquando hai avviato il caricamento ripristinabile.
Un esempio
Content-RangeèContent-Range: bytes 0-8388607/20000000. Per saperne di più su questa intestazione, consultaContent-Range.Se la richiesta ha esito positivo, il server risponde con
308 Resume Incomplete. La risposta contiene un'intestazioneRange.Ripeti i passaggi precedenti per ogni blocco di dati rimanente che vuoi caricare, utilizzando il valore superiore contenuto nell'intestazione
Rangedi ogni risposta per determinare da dove iniziare ogni blocco successivo; non devi presumere che il server abbia ricevuto tutti i byte inviati in una determinata richiesta.(Facoltativo) Nell'ultima richiesta del caricamento ripristinabile puoi includere intestazioni con il prefisso
X-Goog-Meta-per aggiungere metadati personalizzati per l'oggetto.
API XML
Crea un blocco di dati a partire dai dati complessivi che vuoi caricare.
La dimensione del chunk deve essere un multiplo di 256 KiB (256 x 1024 byte), a meno che non si tratti dell'ultimo chunk che completa il caricamento. Dimensioni dei chunk più grandi in genere velocizzano i caricamenti, ma tieni presente che esiste un compromesso tra velocità e utilizzo della memoria. Ti consigliamo di utilizzare almeno 8 MiB per le dimensioni del chunk.
Utilizza
cURLper chiamare l'API XML con una richiesta di oggettoPUT: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"Dove:
CHUNK_LOCATIONè il percorso locale del chunk che stai caricando.CHUNK_SIZEè il numero di byte che stai caricando nella richiesta corrente. Ad esempio,8388608.CHUNK_FIRST_BYTEè il byte iniziale dell'oggetto complessivo contenuto nel chunk che stai caricando.CHUNK_LAST_BYTEè il byte finale dell'oggetto complessivo che contiene il chunk che stai caricando.TOTAL_OBJECT_SIZEè la dimensione totale dell'oggetto che stai caricando. Se non conosci le dimensioni complete dell'oggetto, utilizza*per questo valore.SESSION_URIè il valore restituito nell'intestazioneLocationquando hai avviato il caricamento ripristinabile.
Un esempio
Content-RangeèContent-Range: bytes 0-8388607/20000000. Per saperne di più su questa intestazione, consultaContent-Range.Se la richiesta ha esito positivo, il server risponde con
308 Resume Incomplete. La risposta contiene un'intestazioneRange.Ripeti i passaggi precedenti per ogni blocco di dati rimanente che vuoi caricare, utilizzando il valore superiore contenuto nell'intestazione
Rangedi ogni risposta per determinare da dove iniziare ogni blocco successivo; non devi presumere che il server abbia ricevuto tutti i byte inviati in una determinata richiesta.
Una volta completato il caricamento, riceverai una risposta 200 OK o
201 Created, insieme a tutti i metadati associati alla risorsa.
Se uno dei caricamenti dei chunk viene interrotto o se ricevi una risposta 5xx, devi inviare nuovamente l'intero chunk interrotto o riprendere il caricamento interrotto dal punto in cui si era interrotto.
Controllare lo stato di un caricamento ripristinabile
Se il caricamento ripristinabile viene interrotto o non hai la certezza che sia stato completato, puoi controllare lo stato del caricamento:
API JSON
Utilizza
cURLper chiamare l'API JSON con una richiesta di oggettoPUT:curl -i -X PUT \ -H "Content-Length: 0" \ -H "Content-Range: bytes */OBJECT_SIZE" \ "SESSION_URI"Dove:
OBJECT_SIZEè il numero totale di byte nell'oggetto. Se non conosci le dimensioni complete dell'oggetto, utilizza*per questo valore.SESSION_URIè il valore restituito nell'intestazioneLocationquando hai avviato il caricamento ripristinabile.
API XML
Utilizza
cURLper chiamare l'API XML con una richiesta di oggettoPUT:curl -i -X PUT \ -H "Content-Length: 0" \ -H "Content-Range: bytes */OBJECT_SIZE" \ "SESSION_URI"Dove:
OBJECT_SIZEè il numero totale di byte nell'oggetto. Se non conosci le dimensioni complete dell'oggetto, utilizza*per questo valore.SESSION_URIè il valore restituito nell'intestazioneLocationquando hai avviato il caricamento ripristinabile.
Una risposta 200 OK o 201 Created indica che il caricamento è stato
completato e non sono necessarie ulteriori azioni.
Una risposta 308 Resume Incomplete indica che devi continuare
a caricare i dati.
- Se Cloud Storage non ha ancora reso persistenti i byte, la risposta
308non ha un'intestazioneRange. In questo caso, devi ricominciare il caricamento dall'inizio. - In caso contrario, la risposta
308ha un'intestazioneRange, che specifica quali byte sono stati salvati finora da Cloud Storage. Utilizza questo valore quando riprendi un caricamento interrotto.
Riprendere un caricamento interrotto
Se una richiesta di caricamento viene terminata prima di ricevere una risposta o se ricevi una risposta 503 o 500, devi riprendere il caricamento interrotto dal punto in cui è stato interrotto. Per riprendere un caricamento interrotto:
API JSON
Controlla lo stato del caricamento ripristinabile.
Salva il valore superiore dell'intestazione
Rangecontenuta nella risposta al controllo dello stato. Se la risposta non ha un'intestazioneRange, Cloud Storage non ha ancora reso persistenti i byte e devi caricare dall'inizio.Assicurati che i dati dell'oggetto che stai per caricare inizino dal byte successivo al valore superiore nell'intestazione
Range.Se la richiesta interrotta conteneva intestazioni con il prefisso
X-Goog-Meta-, includile nella richiesta per riprendere il caricamento.Utilizza
cURLper chiamare l'API JSON con una richiesta di oggettoPUTche inizia dal byte successivo al valore nell'intestazioneRange: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"Dove:
PARTIAL_OBJECT_LOCATIONè il percorso locale della parte rimanente dei dati che vuoi caricare.UPLOAD_SIZE_REMAININGè il numero di byte che stai caricando nella richiesta corrente. Ad esempio, il caricamento del resto di un oggetto con una dimensione totale di 20.000.000 che è stato interrotto dopo il caricamento dei byte 0-42 avrebbe unUPLOAD_SIZE_REMAININGdi19999957.NEXT_BYTEè il numero intero successivo al valore che hai salvato nel passaggio 2. Ad esempio, se42è il valore superiore nel passaggio 2, il valore diNEXT_BYTEè43.LAST_BYTEè il byte finale contenuto in questa richiestaPUT. Ad esempio, per completare il caricamento di un oggetto la cui dimensione totale è20000000, il valore diLAST_BYTEè19999999.TOTAL_OBJECT_SIZEè la dimensione totale dell'oggetto che stai caricando. Ad esempio,20000000. Se non conosci le dimensioni complete dell'oggetto, utilizza*per questo valore.SESSION_URIè il valore restituito nell'intestazioneLocationquando hai avviato il caricamento ripristinabile.
API XML
Controlla lo stato del caricamento ripristinabile.
Salva il valore superiore dell'intestazione
Rangecontenuta nella risposta al controllo dello stato. Se la risposta non ha un'intestazioneRange, Cloud Storage non ha ancora reso persistenti i byte e devi caricare dall'inizio.Assicurati che i dati dell'oggetto che stai per caricare inizino dal byte successivo al valore superiore nell'intestazione
Range.Utilizza
cURLper chiamare l'API XML con una richiesta dell'oggettoPUTche inizia dal byte successivo al valore nell'intestazioneRange: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"Dove:
PARTIAL_OBJECT_LOCATIONè il percorso locale della parte rimanente dei dati che vuoi caricare.UPLOAD_SIZE_REMAININGè il numero di byte che stai caricando nella richiesta corrente. Ad esempio, il caricamento del resto di un oggetto con una dimensione totale di 20.000.000 che è stato interrotto dopo il caricamento dei byte 0-42 avrebbe unUPLOAD_SIZE_REMAININGdi19999957.NEXT_BYTEè il numero intero successivo al valore che hai salvato nel passaggio 2. Ad esempio, se42è il valore superiore nel passaggio 2, il valore diNEXT_BYTEè43.LAST_BYTEè il byte finale contenuto in questa richiestaPUT. Ad esempio, per completare il caricamento di un oggetto la cui dimensione totale è20000000, il valore diLAST_BYTEè19999999.TOTAL_OBJECT_SIZEè la dimensione totale dell'oggetto che stai caricando. Ad esempio,20000000. Se non conosci le dimensioni complete dell'oggetto, utilizza*per questo valore.SESSION_URIè il valore restituito nell'intestazioneLocationquando hai avviato il caricamento ripristinabile.
Puoi riprendere i caricamenti tutte le volte che vuoi mentre l'URI della sessione è attivo. L'URI della sessione scade dopo una settimana. Quando i dati vengono caricati correttamente, Cloud Storage risponde con un codice di stato 200 OK o 201 created.
Annullare un caricamento
Per annullare un caricamento ripristinabile incompleto e impedire qualsiasi ulteriore azione:
API JSON
Utilizza
cURLper chiamare l'API JSON con una richiestaDELETE:curl -i -X DELETE -H "Content-Length: 0" \ "SESSION_URI"
Dove:
SESSION_URIè il valore restituito nell'intestazioneLocationquando hai avviato il caricamento ripristinabile.
In caso di esito positivo, la risposta contiene un codice di stato 499. I tentativi futuri
di eseguire query o riprendere il caricamento restituiscono una risposta 4xx.
API XML
Utilizza
cURLper chiamare l'API XML con una richiestaDELETE:curl -i -X DELETE -H "Content-Length: 0" \ "SESSION_URI"
Dove:
SESSION_URIè il valore restituito nell'intestazioneLocationquando hai avviato il caricamento ripristinabile.
In caso di esito positivo, la risposta contiene un codice di stato 204 e i tentativi futuri di eseguire query o riprendere il caricamento restituiscono anche una risposta 204.
Gestione degli errori
In rare circostanze, una richiesta di ripresa di un caricamento interrotto potrebbe non riuscire con un errore "4xx" non ripristinabile perché le autorizzazioni sul bucket sono cambiate o perché il controllo dell'integrità dell'oggetto caricato finale ha rilevato una mancata corrispondenza. In questo caso, riprova a caricare il file avviando una nuova caricamento ripristinabile ripristinabile.
Passaggi successivi
- Scopri di più sui caricamenti ripristinabili.
- Leggi una panoramica dell'API JSON e dell'API XML.
- Caricamenti di stream di dimensioni sconosciute.
- Raggruppa più richieste all'API Cloud Storage JSON.