Как и когда генерировать миниатюру в 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 о том, как пакетно генерировать миниатюры, но я думаю, что должен быть лучший способ.