mongodb - Store file in Mongo's GridFS with ExpressJS after upload -
i have started building rest api using expressjs. new node please bear me. want able let users upload file directly mongo's gridfs using post /upload route.
from understand in expressjs documentation req.files.image object available in route after uploading, includes path , filename attribute. how can read image data , store gridfs?
i have looked gridfs-stream can't tie ends together. first need read file , use data writestream pipe? or can use file object express , use attributes construct writestream? pointers appreciated!
here's simple demo:
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 stream temporary file created express... fs.createreadstream(tempfile) .on('end', function() { res.send('ok'); }) .on('error', function() { res.send('err'); }) // , pipe gfs .pipe(writestream); }); app.get('/download', function(req, res) { // todo: set proper mime type + filename, handle errors, etc... gfs // create read stream gfs... .createreadstream({ filename: req.param('filename') }) // , pipe express' response .pipe(res); }); app.listen(3012); }); i use httpie upload file:
http --form post localhost:3012/upload filename@~/desktop/test.png you can check database if file uploaded:
$ mongofiles list -d test connected to: 127.0.0.1 test.png 5520 you can download again:
http --download localhost:3012/download?filename=test.png
Comments
Post a Comment