Buka konsol

Memperluas Cloud Storage dengan Cloud Functions

Anda dapat memicu fungsi untuk merespons upload, update, atau penghapusan file dan folder di Cloud Storage.

Contoh di halaman ini didasarkan pada fungsi sampel yang dipicu saat file gambar diupload ke Cloud Storage. Fungsi sampel ini menunjukkan cara mengakses atribut peristiwa, cara mendownload file ke instance Cloud Functions, dan dasar-dasar lainnya dalam menangani peristiwa Cloud Storage.

Untuk mengetahui contoh penggunaan lainnya, baca artikel Apa yang dapat saya lakukan dengan Cloud Functions?

Memicu fungsi saat terjadi perubahan di Cloud Storage

Gunakan functions.storage untuk membuat fungsi yang menangani peristiwa Cloud Storage. Gunakan salah satu fungsi berikut, tergantung dari apakah Anda ingin mencakup fungsi ke bucket Cloud Storage tertentu atau menggunakan bucket default:

Misalnya, sampel pembuat thumbnail tercakup dalam bucket default untuk project ini:

exports.generateThumbnail = functions.storage.object().onFinalize(async (object) => {  // ...
});

Cloud Storage mendukung peristiwa ini:

  • onArchive Hanya dikirim saat bucket telah mengaktifkan pembuatan versi objek. Peristiwa ini menunjukkan bahwa versi live dari sebuah objek telah menjadi versi yang diarsipkan, baik karena versi tersebut telah diarsipkan atau ditimpa oleh objek yang diupload dengan nama yang sama.
  • onDelete Dikirim saat sebuah objek telah dihapus secara permanen. Hal ini mencakup objek yang ditimpa atau dihapus sebagai bagian dari konfigurasi siklus proses bucket. Untuk bucket yang telah mengaktifkan pembuatan versi objek, peristiwa ini tidak dikirim saat objek diarsipkan (lihat onArchive), meskipun pengarsipan terjadi melalui metode storage.objects.delete.
  • onFinalize Dikirim saat objek baru (atau pembuatan baru dari objek yang sudah ada) berhasil dibuat dalam bucket. Hal ini meliputi penyalinan atau penulisan ulang objek yang sudah ada. Proses upload yang gagal tidak akan memicu peristiwa ini.
  • onMetadataUpdate Dikirim saat metadata objek yang ada berubah.

Tetapkan peristiwa dalam pengendali peristiwa on seperti yang ditunjukkan di atas untuk onFinalize.

Mengakses atribut objek Storage

Cloud Functions menampilkan sejumlah atribut objek Storage, seperti size dan contentType, untuk file yang diperbarui. Atribut resourceState untuk suatu peristiwa memiliki nilai "exists" (untuk pembuatan dan pembaruan objek) atau "not_exists" (untuk penghapusan dan pemindahan objek). Atribut resourceState harus dipasangkan dengan atribut 'metageneration' jika Anda ingin mengetahui apakah sebuah objek baru saja dibuat atau tidak. Atribut metageneration bertambah setiap kali terjadi perubahan pada metadata objek. Untuk objek baru, nilai metageneration adalah 1.

const fileBucket = object.bucket; // The Storage bucket that contains the file.
const filePath = object.name; // File path in the bucket.
const contentType = object.contentType; // File content type.
const metageneration = object.metageneration; // Number of times metadata has been generated. New objects have a value of 1.

Sampel pembuatan thumbnail ini menggunakan beberapa dari atribut berikut untuk mendeteksi kasus keluar yang dihasilkan dari fungsi:

// Exit if this is triggered on a file that is not an image.
if (!contentType.startsWith('image/')) {
  return console.log('This is not an image.');
}

// Get the file name.
const fileName = path.basename(filePath);
// Exit if the image is already a thumbnail.
if (fileName.startsWith('thumb_')) {
  return console.log('Already a Thumbnail.');
}

Mendownload, mentransformasi, dan mengupload file

Untuk beberapa kasus, mendownload file dari Cloud Storage mungkin tidak diperlukan. Namun, untuk melakukan tugas intensif, seperti membuat gambar thumbnail dari file yang disimpan di Cloud Storage, Anda harus mendownload file ke instance fungsi—yakni, mesin virtual yang menjalankan kode Anda.

Untuk mendownload dan mengupload ulang objek ke Cloud Storage dengan mudah, instal paket Google Cloud Storage menggunakan npm install --save @google-cloud/storage, lalu impor objek tersebut. Untuk menggunakan promise JavaScript yang akan menangani proses eksternal, seperti tugas pemrosesan thumbnail dalam sampel, impor juga child-process-promise:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp()
const spawn = require('child-process-promise').spawn;
const path = require('path');
const os = require('os');
const fs = require('fs');

Gunakan gcs.bucket.file(filePath).download untuk mendownload file ke direktori sementara pada instance Cloud Functions Anda. Di lokasi ini, Anda dapat memproses file sesuai kebutuhan, kemudian menguploadnya ke Cloud Storage. Saat melakukan tugas asinkron, pastikan untuk menampilkan promise JavaScript di callback Anda.

Contoh: transformasi gambar

Cloud Functions menyediakan program pemrosesan gambar bernama ImageMagick, yang dapat melakukan manipulasi pada file gambar grafis. Berikut ini adalah contoh cara membuat gambar thumbnail untuk file gambar yang diupload:

// Download file from bucket.
const bucket = admin.storage().bucket(fileBucket);
const tempFilePath = path.join(os.tmpdir(), fileName);
const metadata = {
  contentType: contentType,
};
await bucket.file(filePath).download({destination: tempFilePath});
console.log('Image downloaded locally to', tempFilePath);
// Generate a thumbnail using ImageMagick.
await spawn('convert', [tempFilePath, '-thumbnail', '200x200>', tempFilePath]);
console.log('Thumbnail created at', tempFilePath);
// We add a 'thumb_' prefix to thumbnails file name. That's where we'll upload the thumbnail.
const thumbFileName = `thumb_${fileName}`;
const thumbFilePath = path.join(path.dirname(filePath), thumbFileName);
// Uploading the thumbnail.
await bucket.upload(tempFilePath, {
  destination: thumbFilePath,
  metadata: metadata,
});
// Once the thumbnail has been uploaded delete the local file to free up disk space.
return fs.unlinkSync(tempFilePath);

Kode ini menjalankan program command line convert dari ImageMagick untuk membuat thumbnail berukuran 200x200 untuk gambar yang disimpan dalam direktori sementara, lalu menguploadnya kembali ke Cloud Storage.

Pelajari contoh lainnya

Contoh lain fungsi transformasi media yang umum meliputi transcoding gambar, memoderasi konten, dan mengekstrak metadata EXIF. Daftar lengkap contoh tersedia di GitHub.

Baca dokumentasi lengkap pemicu Google Cloud Storage untuk informasi lebih lanjut.