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()
        })
}

コードはうまく機能しますが、util で問題が見つかりました。

1:この方法でサムネイルを生成すると、アップロード速度が遅くなります

ユーザーがアップロードした写真ごとに、大、中、小の 3 つのサムネイルを生成する必要があります。最初にアップロードした写真をディスクに保存してから、gm で写真を取得してメタデータをトリミングし、サムネイルを生成します。この方法では、アップロード速度が非常に遅くなります。以前のサムネイルが生成されているため、新しいアップロードを開始できません。私が望むのは、サムネイルの生成をリクエストルートから除外して、最大アップロード速度を維持できるようにすることです。方法はありますか?

2:サムネイルをバッチ生成するより良い方法はありますか

ご覧のとおり、3 つのサムネイルが必要です。サムネイルをバッチ生成する方法に関する gm のドキュメントは見当たりませんでしたが、もっと良い方法が必要だと思います。

4

0 に答える 0