2015-08-19 4 views
-1

Я использую nodeJS и mongoDB для создания формы ввода данных. Часть этой формы требует, чтобы пользователь загружал изображение. Я нашел ресурс, который позволяет вам это делать, но теперь этот код устарел.Сохранение и загрузка изображений в MongoDB 2015 с использованием GridFS

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

Я попытался с помощью busboy как предложено здесь Link

Это сохраняет файл в директорию загрузки, но, очевидно, не MongoDB.

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); 

Update:

мне удалось получить его работу для загрузки, но просмотрев картину, которую я все еще имею следующий вопрос:

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);