Облачные функции для 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.

Другие вопросы по тегам