Melakukan upload yang dapat dilanjutkan

Ringkasan

Halaman ini menjelaskan cara membuat permintaan upload yang dapat dilanjutkan di Cloud Storage JSON API dan XML API. Protokol ini memungkinkan Anda melanjutkan operasi upload setelah kegagalan komunikasi mengganggu aliran data.

Untuk mengetahui informasi tentang cara menggunakan upload yang dapat dilanjutkan di Google Cloud CLI dan library klien, lihat Cara alat dan API menggunakan upload yang dapat dilanjutkan.

Peran yang diperlukan

Untuk mendapatkan izin yang Anda perlukan untuk melakukan upload yang dapat dilanjutkan, minta administrator Anda untuk memberi Anda salah satu peran berikut:

  • Untuk upload yang menyertakan Kunci Retensi Objek, minta administrator Anda untuk memberi Anda peran IAM Storage Object Admin (roles/storage.objectAdmin) untuk bucket.

  • Untuk semua kasus lainnya, minta administrator Anda untuk memberi Anda peran IAM Storage Object User (roles/storage.objectUser) untuk bucket.

Peran bawaan ini berisi izin yang diperlukan untuk mengupload objek ke bucket untuk masing-masing kasusnya. Untuk melihat izin yang benar-benar diperlukan, luaskan bagian Izin yang diperlukan:

Izin yang diperlukan

  • storage.objects.create
  • storage.objects.delete
    • Izin ini hanya diperlukan untuk upload yang menggantikan objek yang sudah ada.
  • storage.objects.setRetention
    • Izin ini hanya diperlukan untuk upload yang menyertakan Kunci Retensi Objek.

Anda juga bisa mendapatkan izin ini dengan peran bawaan atau peran khusus lainnya.

Untuk mengetahui informasi tentang cara memberikan peran pada bucket, lihat Menggunakan IAM dengan bucket.

Memulai sesi upload yang dapat dilanjutkan

Untuk memulai sesi upload yang dapat dilanjutkan:

JSON API

  1. Menginstal dan melakukan inisialisasi gcloud CLI, yang memungkinkan Anda membuat token akses untuk header Authorization.

  2. Opsional, buat file JSON yang berisi metadata yang ingin Anda tetapkan pada objek yang Anda upload. Misalnya, file JSON berikut menetapkan metadata contentType objek yang ingin Anda upload ke image/png:

    {
        "contentType": "image/png"
    }
  3. Gunakan cURL untuk memanggil JSON API dengan permintaan POST Object:

    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"

    Dengan keterangan:

    • METADATA_LOCATION adalah jalur lokal ke file JSON yang berisi metadata opsional yang Anda tentukan di langkah sebelumnya. Jika Anda tidak menyertakan file metadata, kecualikan file ini, bersama dengan --data-binary @ dan header Content-Type.
    • INITIAL_REQUEST_LENGTH adalah jumlah byte dalam isi permintaan awal ini, misalnya 79.
    • BUCKET_NAME adalah nama bucket tempat Anda mengupload objek. Misalnya, my-bucket.
    • OBJECT_NAME adalah nama yang dienkode ke URL yang ingin Anda berikan kepada objek. Misalnya, pets/dog.png, dienkode ke URL sebagai pets%2Fdog.png. Ini tidak diperlukan jika Anda menyertakan name dalam file metadata objek di Langkah 2.

    Jika telah mengaktifkan Cross-Origin Resource Sharing (CORS), Anda juga harus menyertakan header Origin dalam permintaan upload ini dan permintaan-permintaan berikutnya.

    Header opsional yang dapat Anda tambahkan ke permintaan, yang mencakup X-Upload-Content-Type dan X-Upload-Content-Length.

    Jika berhasil, respons akan menyertakan kode status 200 dan terlihat mirip dengan berikut ini:

    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
  4. Simpan URI sesi yang dapat dilanjutkan yang diberikan dalam header location respons terhadap permintaan POST Object Anda.

    URI ini digunakan dalam permintaan berikutnya untuk mengupload data objek.

XML API

  1. Menginstal dan melakukan inisialisasi gcloud CLI, yang memungkinkan Anda membuat token akses untuk header Authorization.

  2. Gunakan cURL untuk memanggil XML API dengan permintaan POST Object yang isinya kosong:

    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"

    Dengan:

    • OBJECT_CONTENT_TYPE adalah jenis konten objek. Misalnya, image/png. Jika jenis konten tidak ditentukan, sistem Cloud Storage akan menetapkan metadata Content-Type untuk objek tersebut menjadi application/octet-stream.
    • BUCKET_NAME adalah nama bucket tempat Anda mengupload objek. Misalnya, my-bucket.
    • OBJECT_NAME adalah nama yang dienkode ke URL yang ingin Anda berikan kepada objek. Misalnya, pets/dog.png, dienkode ke URL sebagai pets%2Fdog.png.

    Jika telah mengaktifkan Cross-Origin Resource Sharing (CORS), Anda juga harus menyertakan header Origin dalam permintaan upload ini dan permintaan-permintaan berikutnya.

    Jika berhasil, respons akan menyertakan pesan status 201.

  3. Simpan URI sesi yang dapat dilanjutkan yang diberikan dalam header location respons terhadap permintaan POST Object Anda.

    URI ini digunakan dalam permintaan berikutnya untuk mengupload data objek.

Mengupload data

Setelah memulai upload yang dapat dilanjutkan, ada dua cara untuk mengupload data objek:

  • Dalam satu potongan: Pendekatan ini biasanya merupakan pendekatan terbaik, karena memerlukan lebih sedikit permintaan sehingga memiliki performa yang lebih baik.
  • Dalam beberapa potongan: Gunakan pendekatan ini jika Anda perlu mengurangi jumlah data yang ditransfer dalam satu permintaan, seperti saat ada batas waktu tetap untuk setiap permintaan, atau jika Anda tidak tahu ukuran total upload pada saat upload dimulai.

Mengupload potongan tunggal

Untuk mengupload data dalam satu potongan:

JSON API

  1. Gunakan cURL untuk memanggil JSON API dengan permintaan PUT Object:

    curl -i -X PUT --data-binary @OBJECT_LOCATION \
        -H "Content-Length: OBJECT_SIZE" \
        "SESSION_URI"

    Dengan keterangan:

    • OBJECT_LOCATION adalah jalur lokal ke objek Anda. Misalnya, Desktop/dog.png.
    • OBJECT_SIZE adalah jumlah byte dalam objek Anda. Misalnya, 20000000.
    • SESSION_URI adalah nilai yang ditampilkan di header location saat Anda memulai upload yang dapat dilanjutkan.

    Atau, Anda dapat menyertakan header yang diawali dengan X-Goog-Meta- guna menambahkan metadata kustom untuk objek tersebut sebagai bagian dari permintaan ini.

XML API

  1. Gunakan cURL untuk memanggil XML API dengan permintaan PUT Object:

    curl -i -X PUT --data-binary @OBJECT_LOCATION \
        -H "Content-Length: OBJECT_SIZE" \
        "SESSION_URI"

    Dengan keterangan:

    • OBJECT_LOCATION adalah jalur lokal ke objek Anda. Misalnya, Desktop/dog.png.
    • OBJECT_SIZE adalah jumlah byte dalam objek Anda. Misalnya, 20000000.
    • SESSION_URI adalah nilai yang ditampilkan di header Location saat Anda memulai upload yang dapat dilanjutkan.

Jika upload selesai secara keseluruhan, Anda akan menerima respons 200 OK atau 201 Created, beserta metadata apa pun yang terkait dengan resource.

Jika permintaan upload terhenti, atau jika Anda menerima respons 5xx, ikuti prosedur dalam Melanjutkan upload yang terhenti.

Mengupload beberapa potongan

Untuk mengupload data dalam beberapa potongan:

JSON API

  1. Buat sepotong data dari keseluruhan data yang ingin Anda upload.

    Ukuran potongan harus merupakan kelipatan dari 256 KiB (256 x 1024 byte), kecuali jika itu adalah potongan terakhir yang menyelesaikan proses upload. Ukuran potongan yang lebih besar biasanya membuat proses upload lebih cepat, tetapi perhatikan bahwa ada konsekuensi antara kecepatan dan penggunaan memori. Sebaiknya gunakan minimal 8 MiB untuk ukuran chunk.

  2. Gunakan cURL untuk memanggil JSON API dengan permintaan PUT Object:

    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"

    Dengan keterangan:

    • CHUNK_LOCATION adalah jalur lokal ke chunk yang sedang Anda upload.
    • CHUNK_SIZE adalah jumlah byte yang Anda upload dalam permintaan saat ini. Misalnya, 8388608.
    • CHUNK_FIRST_BYTE adalah byte awal dalam objek keseluruhan yang berisi potongan yang Anda upload.
    • CHUNK_LAST_BYTE adalah byte akhir dalam objek keseluruhan yang berisi potongan yang Anda upload.
    • TOTAL_OBJECT_SIZE adalah total ukuran objek yang Anda upload.
    • SESSION_URI adalah nilai yang ditampilkan di header Location saat Anda memulai upload yang dapat dilanjutkan.

    Misalnya, Content-Range adalah Content-Range: bytes 0-8388607/20000000. Lihat Content-Range untuk mengetahui informasi selengkapnya tentang header ini.

    Jika permintaan berhasil, server akan merespons dengan 308 Resume Incomplete. Respons berisi Range header.

  3. Ulangi langkah-langkah di atas untuk setiap potongan data yang tersisa yang ingin diupload, menggunakan nilai yang lebih besar yang terdapat dalam header Range dari setiap respons untuk menentukan tempat memulai setiap potongan berikutnya; Anda sebaiknya tidak berasumsi bahwa server menerima semua byte yang dikirim dalam permintaan tertentu.

    Atau, dalam permintaan akhir dari upload yang dapat dilanjutkan, Anda dapat menyertakan header yang diawali dengan X-Goog-Meta- untuk menambahkan metadata kustom bagi objek tersebut.

XML API

  1. Buat sepotong data dari keseluruhan data yang ingin Anda upload.

    Ukuran potongan harus merupakan kelipatan dari 256 KiB (256 x 1024 byte), kecuali jika itu adalah potongan terakhir yang menyelesaikan proses upload. Ukuran potongan yang lebih besar biasanya membuat proses upload lebih cepat, tetapi perhatikan bahwa ada konsekuensi antara kecepatan dan penggunaan memori. Sebaiknya gunakan minimal 8 MiB untuk ukuran chunk.

  2. Gunakan cURL untuk memanggil XML API dengan permintaan PUT Object:

    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"

    Dengan keterangan:

    • CHUNK_LOCATION adalah jalur lokal ke chunk yang sedang Anda upload.
    • CHUNK_SIZE adalah jumlah byte yang Anda upload dalam permintaan saat ini. Misalnya, 8388608.
    • CHUNK_FIRST_BYTE adalah byte awal dalam objek keseluruhan yang berisi potongan yang Anda upload.
    • CHUNK_LAST_BYTE adalah byte akhir dalam objek keseluruhan yang berisi potongan yang Anda upload.
    • TOTAL_OBJECT_SIZE adalah total ukuran objek yang Anda upload.
    • SESSION_URI adalah nilai yang ditampilkan di header Location saat Anda memulai upload yang dapat dilanjutkan.

    Misalnya, Content-Range adalah Content-Range: bytes 0-8388607/20000000. Lihat Content-Range untuk mengetahui informasi selengkapnya tentang header ini.

    Jika permintaan berhasil, server akan merespons dengan 308 Resume Incomplete. Respons berisi Range header.

  3. Ulangi langkah-langkah di atas untuk setiap potongan data yang tersisa yang ingin diupload, menggunakan nilai yang lebih besar yang terdapat dalam header Range dari setiap respons untuk menentukan tempat memulai setiap potongan berikutnya; Anda sebaiknya tidak berasumsi bahwa server menerima semua byte yang dikirim dalam permintaan tertentu.

Setelah upload selesai sepenuhnya, Anda akan menerima respons 200 OK atau 201 Created, beserta metadata apa pun yang terkait dengan resource.

Jika salah satu proses upload potongan terhenti, atau jika Anda menerima respons 5xx, Anda harus mengirim ulang potongan yang terhenti secara keseluruhan atau melanjutkan upload yang terhenti dari posisi terakhirnya.

Memeriksa status upload yang dapat dilanjutkan

Jika upload yang dapat dilanjutkan terhenti, atau Anda tidak yakin proses upload selesai, Anda dapat memeriksa status upload:

JSON API

  1. Gunakan cURL untuk memanggil JSON API dengan permintaan PUT Object:

    curl -i -X PUT \
        -H "Content-Length: 0" \
        -H "Content-Range: bytes */OBJECT_SIZE" \
        "SESSION_URI"

    Dengan keterangan:

    • OBJECT_SIZE adalah total jumlah byte dalam objek Anda. Jika Anda tidak mengetahui ukuran penuh objek, gunakan * untuk nilai ini.
    • SESSION_URI adalah nilai yang ditampilkan di header Location saat Anda memulai upload yang dapat dilanjutkan.

XML API

  1. Gunakan cURL untuk memanggil XML API dengan permintaan PUT Object:

    curl -i -X PUT \
        -H "Content-Length: 0" \
        -H "Content-Range: bytes */OBJECT_SIZE" \
        "SESSION_URI"

    Dengan keterangan:

    • OBJECT_SIZE adalah total jumlah byte dalam objek Anda. Jika Anda tidak mengetahui ukuran penuh objek, gunakan * untuk nilai ini.
    • SESSION_URI adalah nilai yang ditampilkan di header Location saat Anda memulai upload yang dapat dilanjutkan.

Respons 200 OK atau 201 Created menunjukkan bahwa upload telah selesai, dan tidak ada tindakan lebih lanjut yang diperlukan.

Respons 308 Resume Incomplete menunjukkan bahwa Anda perlu melanjutkan mengupload data.

  • Jika Cloud Storage belum mempertahankan byte apa pun, respons 308 tidak memiliki header Range. Dalam kasus ini, Anda harus memulai upload dari awal.
  • Jika tidak, respons 308 memiliki header Range, yang menentukan byte yang telah dipertahankan oleh Cloud Storage sejauh ini. Gunakan nilai ini saat melanjutkan upload yang terganggu.

Melanjutkan upload yang terhenti

Jika permintaan upload dihentikan sebelum menerima respons, atau jika Anda menerima respons 503 atau 500, Anda perlu melanjutkan upload yang terhenti dari posisi terakhirnya. Untuk melanjutkan upload yang terhenti:

JSON API

  1. Periksa status upload yang dapat dilanjutkan.

  2. Simpan nilai yang lebih tinggi dari header Range, yang ada dalam respons, ke pemeriksaan status Anda. Jika respons tidak memiliki header Range, Cloud Storage belum menyimpan byte apa pun, dan Anda harus mengupload dari awal.

  3. Pastikan bahwa data objek yang akan Anda upload dimulai pada byte setelah nilai yang lebih tinggi di header Range.

  4. Jika permintaan yang terhenti berisi header yang diawali dengan X-Goog-Meta-, sertakan header tersebut dalam permintaan untuk melanjutkan upload.

  5. Gunakan cURL untuk memanggil JSON API dengan permintaan PUT Object yang melanjutkan dari byte setelah nilai dalam header Range:

    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"

    Dengan keterangan:

    • PARTIAL_OBJECT_LOCATION adalah jalur lokal ke bagian data yang tersisa yang ingin Anda upload.
    • UPLOAD_SIZE_REMAINING adalah jumlah byte yang Anda upload dalam permintaan saat ini. Misalnya, jika mengupload sisa objek dengan total ukuran 20000000 yang terhenti setelah byte 0-42 diupload, maka nilainya adalah UPLOAD_SIZE_REMAINING 19999957.
    • NEXT_BYTE adalah bilangan bulat berikutnya setelah nilai yang Anda simpan di langkah 2. Misalnya, jika 42 adalah nilai yang lebih besar pada langkah 2, nilai untuk NEXT_BYTE adalah 43.
    • LAST_BYTE adalah byte akhir yang terdapat dalam permintaan PUT ini. Misalnya, untuk menyelesaikan upload objek yang total ukurannya adalah 20000000, nilai untuk LAST_BYTE adalah 19999999.
    • TOTAL_OBJECT_SIZE adalah total ukuran objek yang Anda upload. Misalnya, 20000000.
    • SESSION_URI adalah nilai yang ditampilkan di header Location saat Anda memulai upload yang dapat dilanjutkan.

XML API

  1. Periksa status upload yang dapat dilanjutkan.

  2. Simpan nilai yang lebih tinggi dari header Range, yang ada dalam respons, ke pemeriksaan status Anda. Jika respons tidak memiliki header Range, Cloud Storage belum menyimpan byte apa pun, dan Anda harus mengupload dari awal.

  3. Pastikan bahwa data objek yang akan Anda upload dimulai pada byte setelah nilai yang lebih tinggi di header Range.

  4. Gunakan cURL untuk memanggil XML API dengan permintaan PUT Object yang melanjutkan dari byte setelah nilai dalam header Range:

    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"

    Dengan keterangan:

    • PARTIAL_OBJECT_LOCATION adalah jalur lokal ke bagian data yang tersisa yang ingin Anda upload.
    • UPLOAD_SIZE_REMAINING adalah jumlah byte yang Anda upload dalam permintaan saat ini. Misalnya, jika mengupload sisa objek dengan total ukuran 20000000 yang terhenti setelah byte 0-42 diupload, maka nilainya adalah UPLOAD_SIZE_REMAINING 19999957.
    • NEXT_BYTE adalah bilangan bulat berikutnya setelah nilai yang Anda simpan di langkah 2. Misalnya, jika 42 adalah nilai yang lebih besar pada langkah 2, nilai untuk NEXT_BYTE adalah 43.
    • LAST_BYTE adalah byte akhir yang terdapat dalam permintaan PUT ini. Misalnya, untuk menyelesaikan upload objek yang total ukurannya adalah 20000000, nilai untuk LAST_BYTE adalah 19999999.
    • TOTAL_OBJECT_SIZE adalah total ukuran objek yang Anda upload. Misalnya, 20000000.
    • SESSION_URI adalah nilai yang ditampilkan di header Location saat Anda memulai upload yang dapat dilanjutkan.

Anda dapat melanjutkan upload sebanyak yang diperlukan selama URI sesi aktif; URI sesi akan berakhir setelah seminggu. Jika data berhasil diupload, Cloud Storage akan merespons dengan kode status 200 OK atau 201 created.

Membatalkan upload

Untuk membatalkan upload yang dapat dilanjutkan yang tidak selesai dan mencegah tindakan lebih lanjut pada upload tersebut:

JSON API

  1. Gunakan cURL untuk memanggil JSON API dengan permintaan DELETE:

    curl -i -X DELETE -H "Content-Length: 0" \
      "SESSION_URI"

    Dengan keterangan:

Jika berhasil, respons akan berisi kode status 499. Upaya mendatang untuk mengkueri atau melanjutkan upload akan menghasilkan respons 4xx.

XML API

  1. Gunakan cURL untuk memanggil XML API dengan permintaan DELETE:

    curl -i -X DELETE -H "Content-Length: 0" \
      "SESSION_URI"

    Dengan keterangan:

Jika berhasil, respons akan berisi kode status 204, dan upaya untuk membuat kueri atau melanjutkan upload pada masa mendatang juga akan menghasilkan respons 204.

Penanganan Kegagalan

Dalam keadaan yang jarang terjadi, permintaan untuk melanjutkan upload yang terganggu mungkin gagal dengan error '4xx' yang tidak dapat dicoba lagi karena izin pada bucket telah berubah, atau karena pemeriksaan integritas pada objek yang diupload terakhir mendeteksi ketidakcocokan. Jika hal ini terjadi, coba lagi upload dengan memulai sesi upload baru yang dapat dilanjutkan.

Langkah berikutnya