所以这就是我的应用程序如何处理图像上传和生成缩略图
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中提取图片以裁剪元数据并生成缩略图,这种方法确实会降低上传速度,新的上传无法启动 util 之前生成的缩略图。我想要的是将缩略图生成排除在请求路线之外,这样我就可以保持最大上传速度。知道怎么做吗?
2:有没有更好的批量生成缩略图的方法
如您所见,我需要 3 个缩略图,我没有看到任何关于如何批量生成缩略图的 gm 文档,但我认为必须有更好的方法。