Я использую 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);
Ошибка происходит только некоторое время. Поэтому я не знаю, что вызывает это. Любая помощь будет оценена по достоинству.
Я использовал это в решении, поэтому большое вам спасибо. – onemillion