2012-07-22 190 views
1

我试图建立一个快速和简单的图像上传服务与节点,这需要收到的图像,并将它们保存到Mongo的GridFS。快速响应正文到缓冲区

GridFS的获得需要一个缓冲对象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); 

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显然不是正确的方法走。

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

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

缓冲区长度= 0

我很新的这两个节点和JavaScript的总体发展,所以也许我失去了一些东西很简单,不要犹豫,点明显:)

谢谢!

回答

4

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

身体解析器中间件internally使用Formidable解析文件上传。

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

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

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

这实际上是相对容易。您可以从内部连接主体解析器实现—开始,使用Formidable完成重载—并使用onPartAPI将流传递回您的路由处理程序,以便您可以将它传递给Mongo驱动程序。

+0

Express 4.0使用现在独立的body-parser模块,它不再具有multipart支持https://github.com/expressjs/body-parser/ – 2015-03-27 09:48:42