Skip to content

Instantly share code, notes, and snippets.

@skatesham
Forked from codediodeio/index.js
Created January 22, 2018 01:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save skatesham/c98bea547af44272aa1872dbc5b91997 to your computer and use it in GitHub Desktop.
Save skatesham/c98bea547af44272aa1872dbc5b91997 to your computer and use it in GitHub Desktop.
Firebase Cloud Functions image thumbnail generator using Sharp for 4x faster resizing
const functions = require('firebase-functions');
const gcs = require('@google-cloud/storage')();
const sharp = require('sharp')
const _ = require('lodash');
const path = require('path');
const os = require('os');
exports.generateThumbnail = functions.storage.object('uploads/{imageId}').onChange(event => {
const object = event.data; // The Storage object.
console.log(object)
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 resourceState = object.resourceState; // The resourceState is 'exists' or 'not_exists' (for file/folder deletions).
const metageneration = object.metageneration; // Number of times metadata has been generated. New objects have a value of 1.
const SIZES = [64, 256, 512]; // Resize target width in pixels
if (!contentType.startsWith('image/') || resourceState == 'not_exists') {
console.log('This is not an image.');
return;
}
if (_.includes(filePath, '_thumb')) {
console.log('already processed image');
return;
}
const fileName = filePath.split('/').pop();
const bucket = gcs.bucket(fileBucket);
const tempFilePath = path.join(os.tmpdir(), fileName);
return bucket.file(filePath).download({
destination: tempFilePath
}).then(() => {
_.each(SIZES, (size) => {
let newFileName = `${fileName}_${size}_thumb.png`
let newFileTemp = path.join(os.tmpdir(), newFileName);
let newFilePath = `thumbs/${newFileName}`
sharp(tempFilePath)
.resize(size, null)
.toFile(newFileTemp, (err, info) => {
bucket.upload(newFileTemp, {
destination: newFilePath
});
});
})
})
})
{
"name": "functions",
"description": "Cloud Functions for Firebase",
"dependencies": {
"@google-cloud/storage": "^0.4.0",
"firebase-admin": "^4.1.2",
"firebase-functions": "^0.5",
"lodash": "^4.17.4",
"request-promise": "^2.0.0",
"sharp": "^0.18.1"
},
"private": true
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment