Vishwas Mane
Vishwas Mane

Reputation: 11

MongoDB : Read a file stored using GridFS from MongoDB in Javascript(using Node.JS)

In a mongodb from javascript code I am able to insert a file(of any extension) using gridfs, It's stored as fs.chunks & fs.files. Now i want to read this file's stream, but on any of the read opration calls on gridStore its giving error : "this.data.buffer.slice is not a function". I have used mongojs library from Node.JS.

// Write a file into MongoDB - Working fine.
// Our file ID
var fileId = new ObjectID();
 // Open a new file
var gridStore;
// Create a file and open it
gridStore = new GridStore(db, fileId, "D:/Files/Sofa 2 N050210.3DS", "w+");
var data = fs.readFileSync('D:/Files/Sofa 2 N050210.3DS');
gridStore.open(function (err, gridStore) {

gridStore.write(data, function (err, gridStore) {
// Flush the file to GridFS
gridStore.close(function (err, fileData) {
       // Write successfull
  });
 });
});

Now problem is when reading, After Closing gridStore, I tried to open file for reading & it is giving error at read call i.e on line no-4 in below code.

gridStore.close(function (result) {
var gridStore = new GridStore(db, "test_gs_seek_with_buffer", "r");
gridStore.open(function (err, gridStore) {
gridStore.read(5, function (err, data) {
  if(err){
          console.log("Error"); return;
     }
  console.log(data.toString());   
 });
}); 
});

Please help me find solution or the way to read back the file stored in GridFS (From the javascript code not from the command prompt).

Upvotes: 1

Views: 5251

Answers (1)

Mariya James
Mariya James

Reputation: 985

This code is working fine for me. Try with this. Hope it works.

var mongoose = require('mongoose');
 var Grid = require('gridfs-stream');
mongoose.connection.once('open', function () {
gfs = new Grid(mongoose.connection.db, mongoose.mongo);//If you are using mongoose
 });

var db = new mongo.Db('yourDatabaseName', new mongo.Server("127.0.0.1", 27017));  //if you are using mongoDb directily                                        
var gfs = Grid(db, mongo);         
var rstream = gfs.createReadStream(filename);
var bufs = [];
rstream.on('data', function (chunk) {
    bufs.push(chunk);
}).on('error', function () {
    res.send();
})
.on('end', function () { // done

            var fbuf = Buffer.concat(bufs);

            var File = (fbuf.toString('base64'));

            res.send(File);

 });

Upvotes: 2

Related Questions