Облачные функции для Firebase для загрузки изображения и изменения размера до новой ширины
Я хотел бы использовать облачные функции для Firebase, чтобы изменить размер изображения при загрузке и перезаписать оригинал, чтобы на загрузку оставалось только одно изображение.
Кроме того, вместо того, чтобы создавать изображение с указанной шириной и высотой, я бы хотел, чтобы ImageMagick изменял размер в зависимости от заданной ширины, например 800px.
Я рассмотрел пример Firebase ImageMagick для создания миниатюр при загрузке в качестве начала, но я не вижу, как его изменить, чтобы удовлетворить эту потребность. Буду очень признателен за пример того, как этого добиться.
Изменить: вот основная часть кода, который я использую из примера Firebase ( https://github.com/firebase/functions-samples/blob/master/quickstarts/thumbnails/functions/index.js)
// Download file from bucket.
const bucket = gcs.bucket(fileBucket);
const tempFilePath = `/tmp/${fileName}`;
return bucket.file(filePath).download({
destination: tempFilePath
}).then(() => {
console.log('Image downloaded locally to', tempFilePath);
// Generate a thumbnail using ImageMagick.
return spawn('convert', [tempFilePath, '-thumbnail', '200x200>', tempFilePath]).then(() => {
console.log('Thumbnail created at', tempFilePath);
// We add a 'thumb_' prefix to thumbnails file name. That's where we'll upload the thumbnail.
const thumbFilePath = filePath.replace(/(\/)?([^\/]*)$/, '$1thumb_$2');
// Uploading the thumbnail.
return bucket.upload(tempFilePath, {
destination: thumbFilePath
});
});
});
2 ответа
Вы можете использовать собственные метаданные вместо префикса "thumb_", чтобы избежать зацикливания функции при перезаписи исходного пути к файлу с миниатюрой:
const filePath = event.data.name
const metadata = event.data.metadata
if (metadata.isThumb) {
console.log('Exiting: Already a thumbnail')
return
}
Вам просто нужно установить его после spawn
заканчивает изменение размера:
return spawn(/* ... */)
}).then(_ => {
metadata.isThumb = true // We add custom metadata
const options = {
destination: filePath, // Destination is the same as original
metadata: { metadata: metadata }
}
// Overwrite the original path
return bucket.upload(/* localThumb */, options)
})
В imagemagick вы делаете это
convert inputimage -resize 800x outputimage
без указания высоты и только ширины 800 и "x", она преобразует ширину в 800 и сделает высоту такой, чтобы было сохранено соотношение сторон.
Извините, я не знаю Firebase.