使用Node.js/Mongodb/GridFS在上传时调整图像大小

3
我正在使用Node.js/Express/gridfs-stream/multyparty流将上传的图像保存在Mongodb GridFS中。目前正常运行。
现在,我想在存储到数据库之前将图像“标准化”(调整大小)到某个标准格式。
以下是两种解决方案:
1. 我可以使用gmhttps://github.com/aheckmann/gm并进行流处理,但我必须安装本地ImageMagick(不可选);或者
2. 使用类似于lwiphttps://github.com/EyalAr/lwip的东西并拥有“纯Node”设置,但这样就无法进行流处理。
那么,有没有一种解决方案可以请求 -> 调整大小 -> 存储到GridFS的流式处理而不安装外部库?
当前解决方案(缺少调整大小步骤):
function storeImage(req, err, succ){
  var conn = mongoose.connection;
  var gfs = Grid(conn.db);
  var context = {};

  var form = new multiparty.Form();

  form.on('field', function(name, value){
    context[name] = value;
    console.log(context);
  });

  form.on('part', function(part){
    // handle events only if file part
    if (!part.filename) { return; }

    var options =
    {
      filename: part.filename,
      metadata: context,
      mode: 'w',
      root: 'images'
    };
    var ws = gfs.createWriteStream(options);

    // success GridFS
    ws.on('close', function (file) {
      console.log(file.filename + file._id);
      succ(file._id);
    });

    // error GridFS
    ws.on('error', function (errMsg) {
      console.log('An error occurred!', errMsg);
      err(errMsg);
    });

    part.pipe(ws);
  });

  // Close emitted after form parsed
  form.on('close', function() {
    console.log('Upload completed!');
  });

  form.parse(req);

}
1个回答

0

为了后人纪念

1) 最初我在本地存储图像时使用lwip。当人们开始上传更大的图像(这是必要的要求)时,lwip开始在Heroku上爆炸,因此我切换到

2) 在AWS Lambda上运行的gm而不是ImageMagick,该实例中预配置了ImageMagick。现在将图像存储在S3上并通过CloudFront分发。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接