我正在尝试使用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);
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的开发都很陌生,所以可能我错过了一些非常简单的东西,不要犹豫,指出明显的事情:)
谢谢!
答案 0 :(得分:4)
首先,请记住Express是建立在Connect之上的,internally是处理大量低级HTTP工作的库,而bodyParser()
来自哪里。
正文解析器中间件Formidable使用API来解析文件上传。
Formidable的默认行为是将上传的文件直接写入磁盘 - 换句话说,您实际上无法访问路由处理程序中的上传文件流。您可以获得<input>
中发送的任何常规表单字段(req.body
)的值,并通过req.files
获取上传的文件路径,但是您没有获得文件内容。
简单回答这里只是简单地从磁盘读取文件并使用它保存到Mongo中,记住在完成后删除临时文件。当然,这引入了将文件上载写入临时文件夹然后加载到Mongo的不必要的中间步骤。
如果您想直接将文件数据流式传输到Mongo,那么您面临的挑战就更多了。您必须编写自己的中间件来解析上传流。
这实际上相对很容易。您可以从内部Connect body解析器实现开始 - 使用Formidable来执行繁重的工作 - 并使用onPart
{{3}}将流传递回路由处理程序,以便您可以将其传递给Mongo司机。