Upload media

Mengupload item media adalah proses dua langkah:

  1. Upload byte file media Anda ke Server Google menggunakan endpoint upload. Tindakan ini akan menampilkan token upload yang mengidentifikasi byte yang diupload.
  2. Gunakan panggilan batchCreate dengan token upload untuk membuat item media di akun Google Foto pengguna.

Langkah-langkah ini menguraikan proses upload item media tunggal. Jika Anda mengupload beberapa item media (yang sangat mungkin untuk aplikasi produksi), tinjau praktik terbaik untuk upload guna meningkatkan efisiensi upload Anda.

Sebelum memulai

Cakupan otorisasi yang diperlukan

Mengupload item media ke galeri foto atau album pengguna memerlukan cakupan photoslibrary.appendonly. Untuk mengetahui informasi selengkapnya tentang cakupan, lihat Cakupan otorisasi.

Jenis dan ukuran file yang diterima

Anda dapat mengupload jenis file yang tercantum dalam tabel ini.

Jenis media Jenis file yang diterima Ukuran file maksimum
Foto AVIF, BMP, GIF, HEIC, ICO, JPG, PNG, TIFF, WEBP, beberapa file RAW. 200 MB
Video 3GP, 3G2, ASF, AVI, DIVX, M2T, M2TS, M4V, MKV, MMV, MOD, MOV, MP4, MPG, MTS, TOD, WMV. 20 GB

Langkah 1: Mengupload byte

Upload byte ke Google menggunakan permintaan upload. Permintaan upload yang berhasil akan menampilkan token upload dalam bentuk string teks mentah. Gunakan token upload ini untuk membuat item media dengan panggilan batchCreate.

REST

Sertakan kolom berikut dalam header permintaan POST:

Kolom header
Content-type Tetapkan ke application/octet-stream.
X-Goog-Upload-Content-Type Direkomendasikan. Tetapkan ke jenis MIME byte yang Anda upload. Jenis MIME umum mencakup image/jpeg, image/png, dan image/gif.
X-Goog-Upload-Protocol Tetapkan ke raw.

Berikut adalah header permintaan POST:

POST https://photoslibrary.googleapis.com/v1/uploads
Authorization: Bearer oauth2-token
Content-type: application/octet-stream
X-Goog-Upload-Content-Type: mime-type
X-Goog-Upload-Protocol: raw

Dalam isi permintaan, sertakan biner file:

media-binary-data

Jika permintaan POST ini berhasil, token upload yang berupa string teks mentah akan ditampilkan sebagai isi respons. Untuk membuat item media, gunakan string teks ini dalam panggilan batchCreate.

upload-token

Ukuran file yang disarankan untuk gambar adalah kurang dari 50 MB. File yang berukuran lebih dari 50 MB rawan mengalami masalah performa.

Google Photos Library API mendukung upload yang dapat dilanjutkan. Upload yang dapat dilanjutkan memungkinkan Anda membagi file media menjadi beberapa bagian dan mengupload satu bagian pada satu waktu.

Langkah 2: Membuat item media

Setelah mengupload byte file media, Anda dapat membuatnya sebagai item media di Google Foto menggunakan token upload. Token upload valid selama satu hari setelah dibuat. Item media selalu ditambahkan ke library pengguna. Item media hanya dapat ditambahkan ke album yang dibuat oleh aplikasi Anda. Untuk mengetahui informasi selengkapnya, lihat Cakupan otorisasi.

Untuk membuat item media baru, panggil mediaItems.batchCreate dengan menentukan daftar newMediaItems. Setiap newMediaItem berisi token upload yang ditentukan di dalam simpleMediaItem, dan deskripsi opsional yang ditampilkan kepada pengguna.

Kolom deskripsi dibatasi hingga 1.000 karakter dan hanya boleh menyertakan teks yang bermakna yang dibuat oleh pengguna. Misalnya, "Perjalanan kami ke taman" atau "Makan malam liburan". Jangan sertakan metadata seperti nama file, tag terprogram, atau teks lain yang dibuat secara otomatis.

Untuk performa terbaik, kurangi jumlah panggilan ke mediaItems.batchCreate yang harus Anda lakukan dengan menyertakan beberapa item media dalam satu panggilan. Selalu tunggu hingga permintaan sebelumnya selesai sebelum melakukan panggilan berikutnya untuk pengguna yang sama.

Anda dapat membuat satu item media atau beberapa item media di galeri foto pengguna dengan menentukan deskripsi dan token upload yang sesuai:

REST

Berikut adalah header permintaan POST:

POST https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate
Content-type: application/json
Authorization: Bearer oauth2-token

Isi permintaan harus menentukan daftar newMediaItems.

{
  "newMediaItems": [
    {
      "description": "item-description",
      "simpleMediaItem": {
        "fileName": "filename",
        "uploadToken": "upload-token"
      }
    }
   , ...
  ]
}

Anda juga dapat menentukan albumId dan albumPosition untuk menyisipkan item media di lokasi tertentu dalam album.

REST

{
  "albumId": "album-id",
  "newMediaItems": [
    {
      "description": "item-description",
      "simpleMediaItem": {
        "fileName": "filename",
        "uploadToken": "upload-token"
      }
    }
    , ...
  ],
  "albumPosition": {
    "position": "after-media-item",
    "relativeMediaItemId": "media-item-id"
  }
}

Untuk mengetahui detail selengkapnya tentang pemosisian dalam album, lihat Menambahkan pengayaan.

Respons pembuatan item

Panggilan mediaItems.batchCreate menampilkan hasil untuk setiap item media yang Anda coba buat. Daftar newMediaItemResults menunjukkan status dan menyertakan uploadToken untuk permintaan. Kode status yang bukan nol menunjukkan error.

REST

Jika semua item media berhasil dibuat, permintaan akan menampilkan status HTTP 200 OK. Jika beberapa item media tidak dapat dibuat, permintaan akan menampilkan status HTTP 207 MULTI-STATUS untuk menunjukkan keberhasilan sebagian.

{
  "newMediaItemResults": [
    {
      "uploadToken": "upload-token",
      "status": {
        "message": "Success"
      },
      "mediaItem": {
        "id": "media-item-id",
        "description": "item-description",
        "productUrl": "https://photos.google.com/photo/photo-path",
        "mimeType": "mime-type",
        "mediaMetadata": {
          "width": "media-width-in-px",
          "height": "media-height-in-px",
          "creationTime": "creation-time",
          "photo": {}
        },
        "filename": "filename"
      }
    },
    {
      "uploadToken": "upload-token",
      "status": {
        "code": 13,
        "message": "Internal error"
      }
    }
  ]
}

Jika item berhasil ditambahkan, mediaItem yang berisi mediaItemId, productUrl, dan mediaMetadata akan ditampilkan. Untuk mengetahui informasi selengkapnya, lihat Mengakses item media.

Jika item media adalah video, item tersebut harus diproses terlebih dahulu. mediaItem berisi status di dalam mediaMetadata-nya yang menjelaskan status pemrosesan file video. File yang baru diupload akan menampilkan status PROCESSING terlebih dahulu, sebelum menjadi READY untuk digunakan. Untuk mengetahui detailnya, lihat Mengakses item media.

Jika Anda mengalami error selama panggilan ini, ikuti Praktik terbaik dan coba lagi permintaan Anda. Anda mungkin ingin melacak penambahan yang berhasil, sehingga gambar dapat dimasukkan ke dalam album pada posisi yang benar selama permintaan berikutnya. Untuk mengetahui informasi selengkapnya, lihat Membuat album.

Hasil selalu ditampilkan dalam urutan yang sama dengan pengiriman token upload.

Praktik terbaik untuk upload

Praktik terbaik dan referensi berikut membantu meningkatkan efisiensi Anda secara keseluruhan dengan upload:

  • Ikuti praktik terbaik penanganan percobaan ulang dan error, dengan memperhatikan hal-hal berikut:
    • Error 429 dapat terjadi jika kuota Anda telah habis atau Anda dibatasi kapasitasnya karena melakukan terlalu banyak panggilan terlalu cepat. Pastikan Anda tidak memanggil batchCreate untuk pengguna yang sama hingga permintaan sebelumnya selesai.
    • Error 429 memerlukan penundaan 30s minimum sebelum mencoba lagi. Gunakan strategi backoff eksponensial saat mencoba ulang permintaan.
    • Error 500 terjadi saat server mengalami error. Saat mengupload, hal ini kemungkinan besar karena melakukan beberapa panggilan tulis (seperti batchCreate) untuk pengguna yang sama secara bersamaan. Periksa detail permintaan Anda dan jangan lakukan panggilan ke batchCreate secara paralel.
  • Gunakan alur upload yang dapat dilanjutkan untuk membuat upload Anda lebih andal jika terjadi gangguan jaringan, sehingga mengurangi penggunaan bandwidth dengan memungkinkan Anda melanjutkan upload yang sebagian telah selesai. Hal ini penting saat mengupload dari perangkat seluler klien, atau saat mengupload file berukuran besar.

Selain itu, pertimbangkan tips berikut untuk setiap langkah proses upload: mengupload byte, lalu membuat item media.

Mengupload byte

  • Mengupload byte (untuk mengambil token upload) dapat dilakukan secara paralel.
  • Selalu tetapkan jenis MIME yang benar di header X-Goog-Upload-Content-Type untuk setiap panggilan upload.

Membuat item media

  • Jangan melakukan panggilan secara paralel ke batchCreate untuk satu pengguna.

    • Untuk setiap pengguna, lakukan panggilan ke batchCreate satu per satu (secara serial).
    • Untuk beberapa pengguna, selalu lakukan panggilan batchCreate untuk setiap pengguna satu per satu. Hanya lakukan panggilan untuk pengguna yang berbeda secara paralel.
  • Sertakan sebanyak mungkin NewMediaItems dalam setiap panggilan ke batchCreate untuk meminimalkan jumlah total panggilan yang harus Anda lakukan. Anda dapat menyertakan maksimal 50 item.

  • Tetapkan teks deskripsi yang bermakna yang telah dibuat oleh pengguna. Jangan sertakan metadata seperti nama file, tag terprogram, atau teks lainnya yang dibuat secara otomatis di kolom deskripsi.

Contoh panduan

Contoh ini menggunakan pseudocode untuk memandu proses upload item media bagi beberapa pengguna. Tujuannya adalah untuk menguraikan kedua langkah proses upload (mengupload byte mentah dan membuat item media) dan menjelaskan praktik terbaik untuk membuat integrasi upload yang efisien dan tangguh.

Langkah 1: Upload byte mentah

Pertama, buat antrean untuk mengupload byte mentah untuk item media dari semua pengguna. Lacak setiap uploadToken yang ditampilkan per pengguna. Ingat poin-poin penting berikut:

  • Jumlah thread upload serentak bergantung pada lingkungan operasi Anda.
  • Pertimbangkan untuk mengurutkan ulang antrean upload sesuai kebutuhan. Misalnya, Anda dapat memprioritaskan upload berdasarkan jumlah upload yang tersisa per pengguna, progres keseluruhan pengguna, atau persyaratan lainnya.

Kode semu

CREATE uploadQueue FROM users, filesToUpload
// Upload media bytes in parallel.
START multiple THREADS
  WHILE uploadQueue is not empty
    POP uploadQueue
    UPLOAD file for user
    GET uploadToken
    CHECK and HANDLE errors
    STORE uploadToken for user in uploadTokensQueue
  END

Langkah 2: Buat item media

Pada langkah 1, Anda dapat mengupload beberapa byte dari beberapa pengguna secara paralel, tetapi pada langkah 2, Anda hanya dapat melakukan satu panggilan untuk setiap pengguna dalam satu waktu.

Kode semu

// For each user, create media items once 50 upload tokens have been
// saved, or no more uploads are left per user.
WHEN uploadTokensQueue for user is >= 50 OR no more pending uploads for user
  // Calls can be made in parallel for different users,
  // but only make a single call per user at a time.
  START new thread for (this) user if there is no thread yet
    POP 50 uploadTokens from uploadTokensQueue for user
    CALL mediaItems.batchCreate with uploadTokens
    WAIT UNTIL batchCreate call has completed
    CHECK and HANDLE errors (retry as needed)
  DONE.

Lanjutkan proses ini hingga semua upload dan panggilan pembuatan media selesai.