Storing data stream from POST request in GridFS, express, mongoDB, node.js
gridfs-stream
makes that pretty easy:
// `gfs` is a gridfs-stream instanceapp.post('/picture', function(req, res) { req.pipe(gfs.createWriteStream({ filename: 'test' })); res.send("Success!");});
while @robertklep's answer is correct, I would like to add something to his answer. This code shows how you can send back the stored file's metadata.
app.post('/picture', function(req, res) { req.pipe(gfs.createWriteStream({ filename: 'test' }).on('close', function(savedFile){ console.log('file saved', savedFile); return res.json({file: savedFile}); }));})
This worked for me with mongoose:
var gfs = Grid(mongoose.connection.db, mongoose.mongo); var writeStream = gfs.createWriteStream({ filename: name, mode: 'w', content_type: 'video/mp4' }); writeStream.on('close', function() { console.log('close event'); }); fs.createReadStream('uploads/' + name + '/' + name + '.mp4').pipe(writeStream); console.log('stream.write: ' + name + '/' + name + '.mp4');
I am struggling a couple of days with getting the video on client side browser. That is what I tried so far:
var readstream = gfs.createReadStream({ filename: file.filename }); readstream.on('data', function(data) { res.write(data); console.log(data); }); readstream.on('end', function() { res.end(); }); readstream.on('error', function (err) { console.log('An error occurred!', err); throw err; });
My Data on MongoDB side looks like:
db.fs.chunks.find() { "_id" : ObjectId("5757e76df14741bf0391aaca"), "files_id" : ObjectId("5757e76df14741bf0391aac8"), "n" : 0, "data" : BinData(0,"AAAAIGZ0eXBpc29....
And the contentType is 'video/mp4':
logging on browser side prints this:
Object { 0: "�", 1: "�", 2: "�", 3: " ", 4: "f", 5: "t", 6: "y", 7: "p", 8: "i", 9: "s", 85003 more… }
Could someone please save my live? I hope you do not see my post as not convenient in this place.