简体   繁体   English

使用multer和mongodb将文件上传到node-express站点中的文件夹

[英]uploading file to folder in node-express site using multer with mongodb

I have a node-express app that authenticates user data and upload files using multer, when i click on submit, the name, email, username and password fields are stored in the mongodb database.我有一个 node-express 应用程序,它使用 multer 验证用户数据和上传文件,当我点击提交时,名称、电子邮件、用户名和密码字段存储在 mongodb 数据库中。 But the profileimage file is not stored in the uploads folder nor stored by monogdb.但是 profileimage 文件不存储在uploads 文件夹中,也不存储在monogdb 中。 I tried using some help i found online but all worked with my app but did not store the picture in the folder nor did mongodb pass the profileimage field in the cli as expected by the model i used.我尝试使用我在网上找到的一些帮助,但所有帮助都适用于我的应用程序,但没有将图片存储在文件夹中,mongodb 也没有按照我使用的模型的预期在 cli 中传递 profileimage 字段。 Please What am I not getting right here, that's stopping the file from being uploaded and stored in the required folder and the name of the file being displayed in the mongodb cli?请问我在这里没有得到什么,阻止文件上传和存储在所需的文件夹中,以及在mongodb cli中显示的文件名?

Note: Other codes that worked fine with my app are commented in the below code sample but none stored the picture in the desired folder.注意:在我的应用程序中运行良好的其他代码在下面的代码示例中进行了注释,但没有将图片存储在所需的文件夹中。

users.js用户.js

var express = require('express');
var router = express.Router();
var multer = require('multer');


var uploads = multer({dest: './uploads/'});

/*var storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, './uploads/');
    },
    filename: function (req, file, cb) {
        var originalname = file.originalname;
        var extension = originalname.split(".");
        filename = Date.now() + '.' + extension[extension.length-1];
        cb(null, filename);
    }
}); */

//Require a model page
var User = require('../models/user');
/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});

router.get('/register', function(req, res, next) {
  res.render('register', {
    'title': 'Register'
  });
});

router.get('/login', function(req, res, next) {
  res.render('login', {
    'title': 'Log In'
  });
 });

//router.post('/register', multer({storage: storage, dest: './uploads/'}).single('profileimage'), function(req,res){
router.post('/register', uploads.single('profileimage'), function(req,res,next){
    //Get Form Value
    var name = req.body.name;
    var email = req.body.email;
    var username = req.body.username;
    var password = req.body.password;
    var password2 = req.body.password2;

    //Check for Image field
    if(req.file){
        console.log('uploading File...');

        // File Info
        var profileImageOriginalName = req.files.profileimage.originalname;
        var profileImageName = req.files.profileimage.name;

        var profileImageMime = req.files.profileimage.mimetype;
        var profileImagePath = req.files.profileimage.path;
        var profileImageExt = req.files.profileimage.extension;
        var profileImageSize = req.files.profileimage.size;
    } else {
        // Set a Default Image
        var profileImageName = 'noimage.png';
    }

    /*if(req.file){
     console.log('uploading File...');

     // File Info
     originalname = req.files.profileimage.originalname;
     feildname = req.files.profileimage.fieldname;

     mimetype = req.files.profileimage.mimetype;
     path = req.files.profileimage.path;
     encoding = req.files.profileimage.encoding;
     size = req.files.profileimage.size;
     } else {
     // Set a Default Image
     var original = 'noimage.png';
     } */

    //Form Validation
    req.checkBody('name', 'Name Field is required').notEmpty();
    req.checkBody('email', 'Email Field is required').notEmpty();
    req.checkBody('email', 'Email not valid').isEmail();
    req.checkBody('username', 'Username Field is required').notEmpty();
    req.checkBody('password', 'Password Field is required').notEmpty();
    req.checkBody('password2', 'Passwords do not match').equals(req.body.password);

    //Check for Errors
    var errors = req.validationErrors();

    if(errors){
        res.render('register',{
            errors: errors,
            name: name,
            email: email,
            username: username,
            password: password,
            password2: password2
        });
    } else {
        var newUser = new User({
            name: name,
            email: email,
            username: username,
            password: password,
            profileImage: profileImageName

    });

        //Create User
        User.createUser(newUser, function (err, user) {
            if(err) throw err;
            console.log(user);
        });

        //Success Message
        req.flash('success', 'You are now registered and may Log in');

        res.location('/');
        res.redirect('/');
    }
});
module.exports = router;

app.js应用程序.js

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var expressValidator = require('express-validator');
var cookieParser = require('cookie-parser');

var session = require('express-session');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var bodyParser = require('body-parser');
//var multer = require('multer');
var flash = require('connect-flash');
var mongo = require('mongodb');
var mongoose = require('mongoose');
var db = mongoose.connection;
var multer = require('multer');


var routes = require('./routes/index');
var users = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

//Handle File Uploads
var upload = multer({ dest: './uploads' });

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

//Handle Express Sessions
app.use(session({
  secret:'secret',
  saveUninitialized: true,
  resave: true
}));

//Passport
app.use(passport.initialize());
app.use(passport.session());

// Validator
app.use(expressValidator({
  errorFormatter: function(param, msg, value) {
      var namespace = param.split('.')
      , root    = namespace.shift()
      , formParam = root;

    while(namespace.length) {
      formParam += '[' + namespace.shift() + ']';
    }
    return {
      param : formParam,
      msg   : msg,
      value : value
    };
  }
}));

app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use(flash());
app.use(function (req, res, next) {
  res.locals.messages = require('express-messages')(req, res);
  next();
});

app.use('/', routes);
app.use('/users', users);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});


    module.exports = app;

models/user.js模型/用户.js

var mongoose = require('mongoose');

//This chooses the database to use for storing data a very important step
mongoose.connect('mongodb://localhost/nodeauth');

var db = mongoose.connection;

//User Schema
var UserSchema = mongoose.Schema({
    username: {
        type: String,
        index: true
    },
    password: {
        type: String
    },
    email: {
        type: String
    },
    name: {
        type: String
    },
    profileimaage: {
        type: String
    }
});

var User = module.exports = mongoose.model('User', UserSchema);

module.exports.createUser = function (newUser, callback) {
    newUser.save(callback);
}

create multerhelper.js file in your app nd add below code in it在您的应用程序中创建 multerhelper.js 文件并在其中添加以下代码

const multer = require('multer');

// const fs = require('fs');
let fs = require('fs-extra');

let storage = multer.diskStorage({
  destination: function (req, file, cb) {
    let Id = req.body.id;
    let path = `tmp/daily_gasoline_report/${Id}`;
    fs.mkdirsSync(path);
    cb(null, path);
},
filename: function (req, file, cb) {
    // console.log(file);

    let extArray = file.mimetype.split("/");
    let extension = extArray[extArray.length - 1];
    cb(null, file.fieldname + '-' + Date.now() + "." + extension);
}
})

 var upload = multer({ storage: storage });

let createUserImage = upload.single('images');


let multerHelper = {
createUserImage,

}

module.exports = multerHelper;

in your user.js file import this file在你的 user.js 文件中导入这个文件

const multerhelper = require("../multerhelper.js");

router.post('/register',multerhelper  , function(req,res,next){

Here you are just loading the multer module not using anywhere.在这里,您只是加载了未在任何地方使用的 multer 模块。

Check the link for full uses :检查完整用途的链接:

https://github.com/expressjs/multer https://github.com/expressjs/multer

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM