2016-11-16 3 views
0

Je veux télécharger une image sur mon blog et il y a une erreur, l'image est déjà dans le dossier mais quand je vois la base de données il y a noimage.png par défaut ... Im en utilisant Multer, il est mon code:Multer télécharge mon image localement mais pas dans ma base de données

Addpost.ejs

<% include ./partials/header %> 
<form method="POST" action="/posts/add" enctype="multipart/form-data"> 
    <div class="form-group"> 
     <label>Title</label> 
     <input class="form-control" name="title" type="text"> 
    </div> 
    <div class="form-group"> 
     <label>Category</label> 
     <select class="form-control" name="category"> 
      <% categories.forEach(function(category){ %> 
       <option value="<%= category.title %>"><%= category.title %></option> 
      <% }) %> 
     </select> 
    </div> 
    <div class="form-group"> 
     <label>Body</label> 
     <textarea class="form-control" name="body"></textarea> 
    </div> 
    <div class="form-group"> 
     <label>Main Image</label> 
     <input class="form-control" name="file" type="file"> 
    </div> 
    <div class="form-group"> 
     <label>Author</label> 
     <select class="form-control" name="author"> 
      <option value="Arsen Cenko">Arsen Cenko</option> 
      <option value="John Doe">John Doe</option> 
     </select> 
    </div> 
    <input class="btn btn-default" name 
    ="submit" type="submit" value="save"> 
</form> 
<script src="/app.js"></script> 

PostSchema:

var mongoose = require("mongoose") 
var postSchema = new mongoose.Schema({ 
title: String, 
created: {type: Date, default: Date.now}, 
category: [ 
    { 
     type: mongoose.Schema.Types.ObjectId, 
     ref: "Category" 
    } 
], 
body: String, 
file: String }) 
module.exports = mongoose.model("Post", postSchema); 

Post.js Route

var express = require("express"); 
var router = express.Router(); 
var Post = require("../models/post"); 
var Category = require("../models/category"); 
var path = require('path'); 
var multer = require('multer'); 
var storage = multer.diskStorage({ 
    destination: function (req, file, cb) { 
    cb(null, './public/images/uploads/') 
    }, 
    filename: function (req, file, cb) { 
    cb(null, Date.now() + path.extname(file.originalname)) 
    } }); 
var upload = multer({ storage: storage }); 


router.get("/add", function(req, res) { 
    Category.find({}, function(err, categories){ 
     if(err){ 
      console.log(err); 
     } else{ 
      res.render("addpost", { 
       title: "Add Post", 
       categories: categories 
      }) 
     } 
    }) 
}) 


router.post("/add", upload.single('image'), function(req, res){ 
var title  = req.body.title; 
var category = req.body.category; 
var body  = req.body.body; 
var author  = req.body.author; 

if(req.files && req.files.image){ 
    var imageOriginalName = req.files.image.originalname; 
    var imageName = req.files.image.fieldname; 
    var imageMime = req.files.image.mimetype; 
    var imagePath = req.files.image.path; 
    var imageExt = req.files.image.extension; 
    var imageSize = req.files.image.size; 
} else { 
    var imageName = "noimage.png"; 
} 

var newPost = {title:title, category:category, body:body, author:author, image:imageName}; 

Post.create(newPost, function(err, newPost){ 
    if(err){ 
     console.log("Error"); 
    } else{ 
     res.redirect("/"); 
    } 
}) 

})

Merci :)

+0

Les questions recherchant l'aide au débogage ("pourquoi ce code ne fonctionne-t-il pas?") Doivent inclure le comportement souhaité, un problème ou une erreur spécifique et le code le plus court nécessaire pour le reproduire dans la question. Les questions sans énoncé de problème clair ne sont pas utiles aux autres lecteurs. Voir: [Comment créer un exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve). – Marcs

Répondre

0

Hey selon la documentation

https://github.com/expressjs/multer

en utilisant upload.single('image') va obtenir votre fichier dans "req.file" pas dans "req.files"

Je pense que c'est la raison pour laquelle votre cas échoue et passe à autre chose. Vous ne pouvez pas y accéder comme req.file.image.filename, vous pouvez simplement y accéder via req.file.filename. Comme c'est déjà un fichier "unique". Essayez la console en consignant le fichier req.file pour savoir ce que vous obtenez.

mise à jour Je pense erreur est dans votre html

<input class="form-control" name="file" type="file"> 

devrait être

<input class="form-control" name="image" type="file"> 

l'attribut name du HTML doit être identique à la chaîne dans upload.single. Donc, dans votre cas

upload.single('image') 

Maintenant, vous recevrez le fichier dans req.file.

Espérons que ça aide.

+0

J'ai essayé de cette façon toujours la même chose! –

+0

vérifier ma réponse mise à jour. –