2016-05-02 13 views
1

Ich möchte Bilder in einen bestimmten Ordner laden und den Pfad im Modell mit Mungo und multer Module speichern.Wie kann ich Bilder mit NodeJS hochladen und ausdrücken?

Ich habe hinzugefügt ImageSavePath.array(req.body.image[5]); Wie kann ich den Dateipfad als Zeichenfolge innerhalb ProjectImagePath haben? Hier kommt meine Dateien:

Controller/projectController.js

var mongoose = require('mongoose'); 
var passport = require('passport'); 
var Project = require('../models/projects'); 
var multer = require('multer'); 
var ImageSavePath = multer({ 
    dest: '../userFiles/projectImage', 
    rename: function (fieldname, filename) { 
    return filename.replace(/\W+/g, '-').toLowerCase() + Date.now(); 
    }); 
} 
module.exports = { 

    plain : function (req, res) { 
     //Datos cocinados con la respuesta... 
     if(!req.user){ 
     res.redirect('/user/login'); 
     } 
     res.render('project/resume', { 
     // resume page view parameters 
     title : "proyectos", 
     user : req.user, 
     }); 
    }, 
    create : function (req, res) { 
     //Datos cocinados con la respuesta... 
     if(!req.user){ 
     res.redirect('/user/login'); 
     } 
     res.render('project/create', { 
     // resume page view parameters 
     title : "Crear proyecto", 
     user : req.user, 
     projectName: "Nombre del proyecto", 
     image: "Subir imágen", 
     plane: "Subir plano en formato PDF", 
     details: "Detalles, información sobre el proyecto.", 
     ammount: "¿Cual es el coste de esto?", 
     location: "Localización", 

     }); 
    }, 
    saveProject : function (req, res){ 
     ImageSavePath.array(req.body.image[5]); 
     var saveProject = new Project({ 
     ProjectOwner : req.user._id, 
     ProjectName : req.body.projectName, 
     ProjectDetails : req.body.projectDetails 
     ProjectImagePath : ImageSavePath, 
     ProjectPdfPath : req.body.plane, 
     ProjectAmount : req.body.ammount, 
     ProjectLocation : req.body.localize, 
     }); 
     saveProject.save(function(err){ 
     if(err){ 
      res.render('project/create', { 
      title: "La información no es válida, volver a introducir los datos", 
      }); 
     } 
     }); 
    }, 
    } 

models/projects.js

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 


var project = new Schema({ 
    ProjectOwner: String, 
    ProjectName: String, 
    ProjectDetails: String, 
    ProjectImagePath: [String], 
    ProjectPdfPath: String, 
    ProjectLocation: Number, 
    ProjectAmount: String, 
    }); 

module.exports = mongoose.model('project', project); 

Routen/projects.js

var express = require('express'); 
var controller = require('../controllers/projectController'); 
var passport = require('passport'); 
var router = express.Router(); 


router.get('/', controller.plain); 
router.get('/create', controller.create); 
router.post('/create', controller.saveProject); 
//router.get('/edit', controller.create); 
//router.post('/create', controller.save); 
//router.get('/delete', controller.delete); 
module.exports = router; 

app.js

var express = require('express'); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var morgan = require('morgan'); 
var mongoose = require('mongoose'); 
var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 
var session = require('express-session'); 

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

var app = express(); 
// para devolver estado por consola. 
app.use(morgan('combined')); 
// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'jade'); 
var Account = require('./models/accounts'); 
passport.use(new LocalStrategy(Account.authenticate())); 
passport.serializeUser(Account.serializeUser()); 
passport.deserializeUser(Account.deserializeUser()); 

// 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 })); 
app.use(cookieParser()); 

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

app.use(require('express-session')({ 
    secret: 'topSecret', 
    resave: true, 
    saveUninitialized: true, 
    cookie: { maxAge : 3600000 } //1 Hour 
})); 

app.use(passport.initialize()); 
app.use(passport.session()); 
//Rutas express 
app.use('/', index); 
app.use('/user', users); 
app.use('/project', projects); 

// 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: {} 
    }); 
}); 

mongoose.connect('mongodb://localhost/database'); 

module.exports = app; 

Projekt/create.jade

extends ../includes/layout 

block content 
    div(class="wrap") 
    include ../includes/header 
    div(class="column-group vertical-space") 
     div(class="all-50 push-center") 
     div(class="all-100") 
      h1 #{title} 
     div(class="all-100") 
     form(role="form" method="post" action="create" enctype="multipart/form-data") 
      p #{projectName} 
      input(type="text" name="projectName" required) 
      p #{image} 
      input(type="file" name="image") 
      p #{plane} 
      input(type="file" name="plane") 
      p #{details} 
      input(type="text" name="details") 
      p #{ammount} 
      input(type="number" name="ammount") 
      p #{location} 
      input(type="text" name="localize") 
      button(type="submit") Enviar 
    div(class="push") 
    include ../includes/footer 
+0

Hallo, nitpicker hier, wie geht es dir? Anstatt diese Routen zu machen: 'router.get ('/ create', controller.create);' und 'router.post ('/ create', projectController.saveProject);', sei beruhigender und vermeide die Verben.Sie lesen und erstellen Projekte, also wählen Sie router.get ('/ project /: id', projectController.read); 'und' router.post ('/ project', projectController.create); '. Es sollte auf lange Sicht Ihr Leben erleichtern. – noderman

+0

Danke noderman, aber das ist nicht die Frage. –

+0

Auf 'saveProject', nach' ImageSavePath.array (req.body.image [5]); ', was siehst du, wenn du eine console.log (ImageSavePath) machst. Ist es ein Array mit einem String-Element, das den Pfad enthält? – noderman

Antwort

0

Gelöst!

Schließlich musste ich die oben auf den Routen/projects.js Aufruf der Datei multer ändern und die req.file.path Eigenschaft ProjectImagePath auf den Controller/projectController.js Datei hinzufügen.

Hier kommt der Code:

Routen/projects.js

var express = require('express'); 
var controller = require('../controllers/projectController'); 
var passport = require('passport'); 
var multer = require('multer'); 
var router = express.Router(); 
var storage = multer.diskStorage({ 
    destination: function (req, file, cb) { 
    cb(null, '../userFiles/projectImage') 
    }, 
    filename: function (req, file, cb) { 
    cb(null, "UploadedOn" + Date.now() + "fileOrigName" + file.originalname) 
    } 
}) 
var upload = multer({ storage: storage}); 


router.get('/', controller.plain); 
router.get('/create', controller.create); 
router.post('/create', upload.single('image'), controller.saveProject); 
//router.get('/edit', controller.create); 
//router.post('/create', controller.save); 
//router.get('/delete', controller.delete); 
module.exports = router; 

Controller/projectController.js Code

saveProject : function (req, res, file){ 
     var savingProject = new Project({ 
     ProjectOwner : req.user._id, 
     ProjectName : req.body.projectName, 
     ProjectDetails : req.body.details, 
     ProjectImagePath : req.file.path, 
     //ProjectPdfPath : .plane, 
     ProjectAmount : req.body.ammount, 
     ProjectLocation : req.body.localize, 
     }); 
     console.log("***start viewing content from req.body***"); 
     console.log(req.body); 
     console.log("***start viewing content from req.file***"); 
     console.log(req.file); 
     console.log("***start viewing content from savingProject variable***"); 
     console.log(savingProject); 
     savingProject.save(function(err){ 
     if(err){ 
      console.log(err); 
      res.render('project/create', { 
      title: "La información no es válida, volver a introducir los datos", 
      }); 
     } 
     if(!err){res.send('ok');} 
     }); 
    }, 

die console.log

***start viewing content from req.body*** 
{ projectName: 'testingproj', 
    details: 'dwada', 
    ammount: '111111111', 
    localize: 'dwada' } 
***start viewing content from req.file*** 
{ fieldname: 'image', 
    originalname: '13062537_587472701434355_1300164321309994729_n.jpg', 
    encoding: '7bit', 
    mimetype: 'image/jpeg', 
    destination: '../userFiles/projectImage', 
    filename: 'UploadedOn1462292710895fileOrigName13062537_587472701434355_1300164321309994729_n.jpg', 
    path: '../userFiles/projectImage/UploadedOn1462292710895fileOrigName13062537_587472701434355_1300164321309994729_n.jpg', 
    size: 88911 } 
***start viewing content from savingProject variable*** 
{ _id: 5728d0e6552274ac2286a84c, 
    ProjectLocation: 'dwada', 
    ProjectAmount: 111111111, 
    ProjectImagePath: '../userFiles/projectImage/UploadedOn1462292710895fileOrigName13062537_587472701434355_1300164321309994729_n.jpg', 
    ProjectDetails: 'dwada', 
    ProjectName: 'testingproj', 
    ProjectOwner: '5720977ffe0697f51001c9a1' } 
0

Partiell gelöst

war ein Problem bei der Verwendung in Form vonenctype="multipart/form-data" in die create.jade Vorlage, ohne diese kann ich die Feldinformation zu 0 hinzufügenEigenschaften wie req.body.projectName, req.body.plane, req.body.details ... Ich muss lösen, was passiert mit dem enctype und speichern Sie die Dateien in einem Ordner mit dem Pfad in der Datenbank gespeichert.

+0

Von der Multer-Dokumentation (https://github.com/expressjs/multer): ** HINWEIS: Multer verarbeitet keine Formulare, die nicht mehrteilig sind (mehrteilige/Formulardaten). ** - also müssen Sie verwenden 'multipart/form-data' - das sollte nicht dein Problem sein ... – noderman