[英]How to save uploaded image from multer to mongodb in nodejs
我需要将用户信息从注册表单保存到 mongodb。 除图像文件外,一切正常。 我正在使用 Multer 将图像从表单上传到服务器。
还可以在用户登录后在个人资料页面中显示该图像。
下面是代码:
注册.ejs:
<form action="/signup" method="post" enctype="multipart/form-data">
<label for>Profile Picture</label>
<input type="file" name="image"><br><br>
<label for>Name</label>
<input type="text" name="name"><br><br>
<label for>Email</label>
<input type="email" name="email"><br><br>
<label for>Password</label>
</form>
路线.js:
var multer = require('multer');
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, './uploads');
},
filename: function (req, file, cb) {
cb(null, file.originalname);
}
});
var upload = multer({ storage: storage });
module.exports = function(app, passport) {
app.post('/signup', upload.single('image'), passport.authenticate('local-signup', {
successRedirect : '/login',
failureRedirect : '/',
failureFlash : true
}));
图像上传到 /uploads 文件夹中。
但是如何获取该图像并将其保存在 mongodb 中。 我正在使用 passport.js,下面是保存发布数据的代码。
用户模型.js:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var userSchema = new Schema({
image: {
data : Buffer,
contentType : String
},
name: {
type: String,
},
email: {
type: String,
},
password: {
type: String,
}
});
护照.js:
passport.use('local-signup', new LocalStrategy({
usernameField : 'email',
passwordField : 'password',
passReqToCallback : true
},
function(req, email, password, done) {
User.findOne({ 'email' : email }, function(err, user) {
if (err) {
//errorLogger.error(err);
return done(err);
}
if (user) {
return done(null, false, req.flash('signupMessage', 'Email already exists.'));
} else {
var newUser = new User();
//newUser.image = "dont know how to get image from /uploads"
newUser.name = req.body.name;
newUser.email = req.body.email;
newUser.password = req.body.password;
newUser.save(function(err) {
if (err)
throw err;
return done(null, newUser, req.flash('signupMessage', 'User created'));
});
}
});
您可以创建自己的中间件来处理上传中间件并获取文件名。
我还建议在上传图片的末尾添加一些随机字符串,以防止重名。
app.post('/signup', middleware , passport.authenticate('local-signup', {
successRedirect : '/login',
failureRedirect : '/',
failureFlash : true
}));
中间件
function middleware(req, res, next) {
var imageName;
var uploadStorage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, './uploads');
},
filename: function (req, file, cb) {
imageName = file.originalname;
//imageName += "_randomstring"
cb(null, imageName);
}
});
var uploader = multer({storage: uploadStorage});
var uploadFile = upload.single('image');
uploadFile(req, res, function (err) {
req.imageName = imageName;
req.uploadError = err;
next();
})
}
你可以使用 req.imageName
passport.use('local-signup', new LocalStrategy({
usernameField : 'email',
passwordField : 'password',
passReqToCallback : true
},
function(req, email, password, done) {
User.findOne({ 'email' : email }, function(err, user) {
if (err) {
//errorLogger.error(err);
return done(err);
}
if (user) {
return done(null, false, req.flash('signupMessage', 'Email already exists.'));
} else {
var newUser = new User();
newUser.image = req.imageName;
newUser.name = req.body.name;
newUser.email = req.body.email;
newUser.password = req.body.password;
newUser.save(function(err) {
if (err)
throw err;
return done(null, newUser, req.flash('signupMessage', 'User created'));
});
}
});
如果您使用的图像格式为“jpeg / png”并且小于 16mb,则可以使用此 github 存储库,它是一个有助于将图像轻松保存到 mongodb 的模块,并且没有 GRIDFS 的复杂性,但以防万一你的文件大于 16mb,你需要使用 GRIDFS,
这是 github 存储库的链接,用于小于 16 mb 的图像(也适用于 React)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.