Как и когда генерировать миниатюру в node.js?

Итак, вот как мое приложение обрабатывает загрузку изображений и генерирует миниатюры

router.post('/upload', saveupload, generateThumb, saveDB)

function generateThumb (req, res, next){

    var filePath = req.files.file.path;
    var fileDir = req.files.file.dir;
    var filename = req.files.file.name;

    async.series({
        noProfile:function(callback){
            gm(filePath)
                .noProfile()
                .write(filePath, function(err){
                    callback(err);
                })
        },
        large:function(callback){
            var thumb_width = config.thumb.lg.width;
            var thumb_height = config.thumb.lg.height;
            var quality = config.thumb.lg.quality;
            var thumbName = filename.split('.')[0]+'_thumb_'+thumb_width+'x'+thumb_height+'.'+filename.split('.')[1];
            var thumbPath = path.join(fileDir, thumbName);
            gm(filePath)
                .noProfile()
                .resize(thumb_width, thumb_height)
                .quality(quality)
                .write(thumbPath, function(err){
                    callback(err)
                })
        },
        middle:function(callback){
            var thumb_width = config.thumb.md.width;
            var thumb_height = config.thumb.md.height;
            var quality = config.thumb.md.quality;
            var thumbName = filename.split('.')[0]+'_thumb_'+thumb_width+'x'+thumb_height+'.'+filename.split('.')[1];
            var thumbPath = path.join(fileDir, thumbName);
            gm(filePath)
                .noProfile()
                .resize(thumb_width, thumb_height)
                .quality(quality)
                .write(thumbPath, function(err){
                    callback(err)
                })
        },
        small:function(callback){
            var thumb_width = config.thumb.sm.width;
            var thumb_height = config.thumb.sm.height;
            var quality = config.thumb.sm.quality;
            var thumbName = filename.split('.')[0]+'_thumb_'+thumb_width+'x'+thumb_height+'.'+filename.split('.')[1];
            var thumbPath = path.join(fileDir, thumbName);
            gm(filePath)
                .noProfile()
                .resize(thumb_width, thumb_height)
                .quality(quality)
                .write(thumbPath, function(err){
                    callback(err)
                })
        }},
        function(err, obj){
            if(err){
                return next(err)
            }

            next()
        })
}

код работает хорошо, теперь я нахожу некоторые проблемы:

1: создать миниатюру таким образом замедляет скорость загрузки

для каждого загруженного пользователем изображения мне нужно сгенерировать 3 миниатюры: большие, средние, маленькие, сначала я сохраняю загруженное изображение на диск, а затем собираю изображение в gm, чтобы обрезать метаданные и создавать миниатюры, этот метод действительно замедляет скорость загрузки, новая загрузка не может быть запущена, если создан предыдущий эскиз. я хочу, чтобы генерация миниатюр не попадала в маршрут запроса, чтобы я мог поддерживать максимальную скорость загрузки. есть идеи как?

2: есть ли лучший способ пакетной генерации миниатюр

Как видите, мне нужно 3 миниатюры, я не видел ни одного документа gm о том, как пакетно генерировать миниатюры, но я думаю, что должен быть лучший способ.

0 ответов

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