2015-08-19 48 views
-1

我使用nodeJS和mongoDB创建数据输入表单。部分表格要求用户上传图片。我发现了一个资源,可以让你做到这一点,但现在这个代码已被弃用。使用GridFS在MongoDB 2015中保存和加载图像

app.use(express.bodyParser((uploadDir: __dirname + '/public/uploads'))); 

这里 Link

建议此文件保存到上传目录,但显然不是MongoDB中我一直在使用busboy尝试。

的Youtube视频Link

的YouTube视频的结果正是我需要为我的网站。我只需要知道将使这种可能的代码,现在身体分析器被快速弃用。

这里是我的全部的NodeJS代码:

var express = require('express'); 
var app = express(); 
var path = require('path'); 
var bodyParser = require('body-parser'); 
var mongo = require('mongodb'); 
var fs = require('fs'); 
var GridStore = mongo.GridStore; 
var Server = mongo.Server; 
var ObjectID = mongo.ObjectId; 
var Db = mongo.Db; 
var busboy = require('connect-busboy'); 

var server = new Server('localhost',27017,{auto_reconnect:true}); 
var db = new Db('exampleDb',server); 

db.open(function(err,db){ 
    if(err) 
    { 
     console.log('Couldnt connect to mongo'); 
    }else{ 
     console.log('Connected to Mongo'); 
    } 
}); 

    //app.use(express.static(__dirname +'/public')); 
    app.use(express.static(path.join(__dirname, 'public'))); 
    //app.use(express.bodyParser((uploadDir: __dirname + '/public/uploads'))); 
    // app.use(bodyParser({uploadDir: __dirname + '/public/uploads'})); 

app.use(busboy()); 

//app.use(bodyParser.urlencoded({ 
// extended: true 
//})); 

app.get('/index.html', function (req, res) { 
    res.sendFile(__dirname + "index.html"); 
}); 

app.post('/upload',function(req,res){ 
    var fstream; 
    req.pipe(req.busboy); 
    req.busboy.on('file', function (fieldname, file, filename) { 
     console.log("Uploading: " + filename); 
     fstream = fs.createWriteStream(__dirname + '/assets/uploads/' + filename); 
     file.pipe(fstream); 
     fstream.on('close', function() { 
      res.redirect('back'); 
     }); 
    }); 
console.dir(req.file); 
}); 



app.listen(3000); 

更新:

我设法得到它的工作上传,但观看的图片我仍然有以下问题:

MongoError: file with id 55d5a3416aebd290131ca6d2 not opened for writing c:\MyProjects\gridFStesting\node_modules\mongodb\lib\utils.js:97 process.nextTick(function() { throw err; }); ^ TypeError: Cannot read property 'stream' of undefined

这是我的更新的代码:

var express = require('express'); 
var app = express(); 
var path = require('path'); 
var bodyParser = require('body-parser'); 
var mongo = require('mongodb'); 
var fs = require('fs'); 
var GridStore = mongo.GridStore; 
var Server = mongo.Server; 
var ObjectID = mongo.ObjectId; 
var Db = mongo.Db; 
var busboy = require('connect-busboy'); 
var Grid = require('gridfs-stream'); 

var db = new mongo.Db('testing',new mongo.Server("127.0.0.1",27017)); 
var gfs = Grid(db,mongo); 

db.open(function(err,db){ 
    if(err) 
    { 
     console.log('Couldnt connect to mongo'); 
    }else{ 
     console.log('Connected to Mongo'); 
    } 
}); 

    //app.use(express.static(__dirname +'/public')); 
    app.use(express.static(path.join(__dirname,'public'))); 
    //app.use(express.bodyParser((uploadDir: __dirname + '/public/uploads'))); 
    // app.use(bodyParser({uploadDir: __dirname + '/public/uploads'})); 

app.use(busboy()); 

//app.use(bodyParser.urlencoded({ 
// extended: true 
//})); 

app.get('/index.html', function (req, res) { 
    res.sendFile(__dirname + "index.html"); 
}); 

app.post('/upload',function(req,res){ 
    var fstream; 
    req.pipe(req.busboy); 
    req.busboy.on('file', function(fieldname, file, filename, encoding, mimetype) { 
     console.log('File [' + fieldname + ']: filename: ' + filename); 
     var gfsstream = gfs.createWriteStream('pic'); 
     file.pipe(gfsstream).on('finish', function() { 
      console.log('File [' + fieldname + '] Finished'); 
      console.log(gfsstream); 
     }); 
    }); 
    // var gridStoreWrite = new GridStore(db,new ObjectID(),req.files.pic.name,"w",{chunkSize:1024,metadata:{}}) 
//console.dir('testing'); 
}); 

app.get('/image/:id',function(req,res){ 

    var id = req.params.id; 
    var ObjectId = require('mongodb').ObjectID; 
    var outPutFromDbFile = __dirname + '/public/uploads/' + id + '.png'; 
    var writeStream = fs.createWriteStream(outPutFromDbFile); 

    // var BSON = require('mongodb').BSONPure; 
    // var o_id = BSON.ObjectID.createFromHexString(id); 

    var o_id = ObjectID(id); 

    var gridStore = new GridStore(db,o_id,"r"); 
    gridStore.open(function (err,gridStore){ 
     if(err) 
     { 
      console.log('error' + err); 
     } 

     var readStream = gridStore.stream(true); 
     readStream.on("end",function(){ 
      console.log('close was called'); 
      res.sendFile(outPutFromDbFile); 
     }); 
     readStream.pipe(writeStream); 
    }); 

}); 

app.listen(3000); 

错误只发生在一些时间。所以我不知道是什么原因造成的。任何帮助,将不胜感激。

回答

0

如果使用gridfs-stream模块,你可以做这样的事情:

var mongo = require('mongodb'); 
var Grid = require('gridfs-stream'); 

// create or use an existing mongodb-native db instance 
var db = new mongo.Db('yourDatabaseName', new mongo.Server("127.0.0.1", 27017)); 
var gfs = Grid(db, mongo); 

// ... 

req.busboy.on('file', function(fieldname, file, filename, encoding, mimetype) { 
    console.log('File [' + fieldname + ']: filename: ' + filename); 
    var gfsstream = gfs.createWriteStream('/uploads'); 
    file.pipe(gfsstream).on('finish', function() { 
    console.log('File [' + fieldname + '] Finished'); 
    }); 
}); 
+0

我在解决方案中使用了这个,非常感谢。 – onemillion

0

这解决我的问题,我希望它能帮助任何人停留在未来的这个问题。

var express = require('express'); 
var app = express(); 
var path = require('path'); 
var bodyParser = require('body-parser'); 
var mongo = require('mongodb'); 
var fs = require('fs'); 
var GridStore = mongo.GridStore; 
var Server = mongo.Server; 
var ObjectID = mongo.ObjectId; 
var Db = mongo.Db; 
var busboy = require('connect-busboy'); 
var Grid = require('gridfs-stream'); 

var db = new mongo.Db('testing',new mongo.Server("127.0.0.1",27017)); 
var gfs = Grid(db,mongo); 

db.open(function(err,db){ 
    if(err) 
    { 
     console.log('Couldnt connect to mongo'); 
    }else{ 
     console.log('Connected to Mongo'); 
    } 
}); 

    //app.use(express.static(__dirname +'/public')); 
    app.use(express.static(path.join(__dirname,'public'))); 
    //app.use(express.bodyParser((uploadDir: __dirname + '/public/uploads'))); 
    // app.use(bodyParser({uploadDir: __dirname + '/public/uploads'})); 

app.use(busboy()); 

//app.use(bodyParser.urlencoded({ 
// extended: true 
//})); 

app.get('/index.html', function (req, res) { 
    res.sendFile(__dirname + "index.html"); 
}); 

app.post('/upload',function(req,res){ 
    var fstream; 
    req.pipe(req.busboy); 
    req.busboy.on('file', function(fieldname, file, filename, encoding, mimetype) { 
     console.log('File [' + fieldname + ']: filename: ' + filename); 
     var gfsstream = gfs.createWriteStream('pic'); 
     file.pipe(gfsstream).on('finish', function() { 
      console.log('File [' + fieldname + '] Finished'); 
      console.log(gfsstream); 
     }); 
    }); 
    // var gridStoreWrite = new GridStore(db,new ObjectID(),req.files.pic.name,"w",{chunkSize:1024,metadata:{}}) 
//console.dir('testing'); 
}); 

app.get('/image/:id',function(req,res){ 

    var id = req.params.id; 
    var ObjectId = require('mongodb').ObjectID; 
    var outPutFromDbFile = __dirname + '/public/uploads/' + id + '.png'; 
    var writeStream = fs.createWriteStream(outPutFromDbFile); 

    // var BSON = require('mongodb').BSONPure; 
    // var o_id = BSON.ObjectID.createFromHexString(id); 

    var o_id = ObjectID(id); 

    var gridStore = new GridStore(db,o_id,"r"); 
    gridStore.open(function (err,gridStore){ 
     if(err) 
     { 
      console.log('error' + err); 
     } 

     var readStream = gridStore.stream(true); 
     readStream.on("end",function(){ 
      console.log('close was called'); 
      res.sendFile(outPutFromDbFile); 
     }); 
     readStream.pipe(writeStream); 
    }); 

}); 

app.listen(3000); 
相关问题