これが私のアプリが画像のアップロードを処理し、サムネイルを生成する方法です
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 のドキュメントは見当たりませんでしたが、もっと良い方法が必要だと思います。