2016-08-27 2 views
0

J'ai une application node-express qui authentifie les données utilisateur et télécharge les fichiers en utilisant multer, quand je clique sur submit, les champs nom, email, nom d'utilisateur et mot de passe sont stockés dans la base de données mongodb. Mais le fichier profileimage n'est pas stocké dans le dossier uploads ni stocké par monogdb. J'ai essayé d'utiliser de l'aide que j'ai trouvée en ligne, mais tout a fonctionné avec mon application mais n'a pas stocké l'image dans le dossier ni mongodb n'a pas passé le champ profileimage dans le cli comme prévu par le modèle que j'ai utilisé. S'il vous plaît, qu'est-ce que je n'arrive pas ici, cela empêche le fichier d'être téléchargé et stocké dans le dossier requis et le nom du fichier affiché dans le cli mongodb?Télécharger un fichier dans un dossier dans un site node-express en utilisant multer avec mongodb

Remarque: Les autres codes qui ont bien fonctionné avec mon application sont commentés dans l'exemple de code ci-dessous, mais aucun n'a stocké l'image dans le dossier souhaité.

users.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

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; 

modèles/user.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); 
} 
+0

Vous devez utiliser multer dans users.js plutôt que d'utiliser dans app.js qui est vous devez définir 'var multer = require ('multer'); 'et' var upload = multer ({dest: './uploads'}); 'dans users.js, puis essayez-le. S'il vous plaît jeter un oeil [docs multer] (https://github.com/expressjs/multer) –

+0

@ ArifKhan je l'utilise là et même lire la documentation sur github et npm mais je n'ai pas eu plus loin. –

Répondre

0

Ici vous êtes en train de chargement du module multer ne pas utiliser partout.

Vérifiez le lien pour des utilisations complètes:

https://github.com/expressjs/multer

+0

J'utilise le module multer dans le fichier users.js. –