1

我正在尝试使用 Node 构建一个快速简单的图像上传服务,它将接收到的图像保存到 Mongo 的 GridFS 中。

GridFS get 需要一个 Buffer 对象NodeJS Mongo Driver GridFS put

问题很简单:我如何准确地将接收到的请求正文转换/转换为适当的缓冲区。

到目前为止我的代码(只有重要的部分):api.js

var express = require('express');
var connect = require('connect');

var app = module.exports = express.createServer();

app.configure(function(){
  app.use(express.bodyParser()); 
  app.use(express.methodOverride());
  app.use(app.router);
});

var upload = require('./upload.js');
app.post('/upload', upload.upload);

上传.js

exports.upload = (function(req, res, next){
  console.log("Uploading image...");
  // Create buffer
  // Rest of the code
}

我试过了:

  var buffer = new Buffer(util.inspect(req.body),'binary');

创建缓冲区,但它的大小错误,并且可能不是正确的内容,因为 util.inspect 显然不是正确的方法。

并且: var buffer = new Buffer(req.body); 结果:

 [Decode error - output not utf-8][Decode error - output not utf-8]

缓冲区长度 = 0

一般来说,我对 Node 和 JavaScript 开发都很陌生,所以我可能遗漏了一些非常简单的东西,请毫不犹豫地指出显而易见的东西:)

谢谢!

4

1 回答 1

4

首先,请记住 Express 是建立在 Connect 之上的,Connect是处理大量较低级别 HTTP 工作的库,这就是它的bodyParser()来源。

body 解析器中间件内部使用Formidable来解析文件上传。

Formidable 的默认行为是将上传的文件直接写入磁盘——换句话说,您实际上无法访问路由处理程序中的上传文件流。您会获得任何常规表单字段的值(<input>s)req.body,并且您会通过 获得上传的文件路径req.files,但您不会获得文件内容。

这里的简单答案是简单地从磁盘读取文件并使用它保存到 Mongo,记住在完成后删除临时文件。当然,这引入了将文件上传到临时文件夹然后加载到 Mongo 的不必要的中间步骤。

如果您想将文件数据直接流式传输到 Mongo,您将面临更多挑战。您必须编写自己的中间件来解析上传流。

这实际上是相对容易的。您可以从内部 Connect 主体解析器实现开始——使用 Formidable 来完成繁重的工作——并使用onPart API将流传递回您的路由处理程序,以便您可以将其传递给 Mongo 驱动程序。

于 2012-07-22T03:35:51.593 回答