2

所以这就是我的应用程序如何处理图像上传和生成缩略图

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 文档,但我认为必须有更好的方法。

4

0 回答 0