我已经开始使用expressJS构建REST api.我是节点新手所以请耐心等待.我希望能够让用户使用post/upload路由直接将文件上传到Mongo的GridFS.
根据我在expressJS文档中的理解,req.files.image对象在上传后的路径中可用,其中还包括路径和文件名属性.但是,我如何准确读取图像数据并将其存储到GridFS中?
我已经研究过gridfs-stream,但我无法将两端绑在一起.我是否首先需要读取文件,然后将该数据用于写入流管道?或者我可以只使用express中的文件对象并使用这些属性构建写入流吗?任何指针将不胜感激!
这是一个简单的演示:
var express = require('express'); var fs = require('fs'); var mongo = require('mongodb'); var Grid = require('gridfs-stream'); var db = new mongo.Db('test', new mongo.Server("127.0.0.1", 27017), { safe : false }); db.open(function (err) { if (err) { throw err; } var gfs = Grid(db, mongo); var app = express(); app.use(express.bodyParser()); app.post('/upload', function(req, res) { var tempfile = req.files.filename.path; var origname = req.files.filename.name; var writestream = gfs.createWriteStream({ filename: origname }); // open a stream to the temporary file created by Express... fs.createReadStream(tempfile) .on('end', function() { res.send('OK'); }) .on('error', function() { res.send('ERR'); }) // and pipe it to gfs .pipe(writestream); }); app.get('/download', function(req, res) { // TODO: set proper mime type + filename, handle errors, etc... gfs // create a read stream from gfs... .createReadStream({ filename: req.param('filename') }) // and pipe it to Express' response .pipe(res); }); app.listen(3012); });
我使用httpie上传文件:
http --form post localhost:3012/upload filename@~/Desktop/test.png
如果文件已上传,您可以检查数据库:
$ mongofiles list -d test connected to: 127.0.0.1 test.png 5520
您也可以再次下载:
http --download get localhost:3012/download?filename=test.png