2016-11-16 20 views
0

私のブログの投稿に画像をアップロードしたいのですが、エラーはあります。 ... Multerを使用してイム、私のコードがある:Multerは自分のイメージをローカルにアップロードしていますが、データベースにはアップロードしていません

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ルート

"req.file" でファイルを取得します upload.single('image')を使用してドキュメント

https://github.com/expressjs/multer

に応じ

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("/"); 
    } 
}) 

})

感謝:)

+0

デバッグヘルプ(「なぜこのコードは動作しませんか?」)には、目的の動作、特定の問題またはエラー、および質問自体に再現するのに必要な最短コードが含まれている必要があります。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:[最小限で完全で検証可能なサンプルの作成方法](http://stackoverflow.com/help/mcve) – Marcs

答えて

0

ねえ「req.files」には含まれません

これは、あなたのケースが失敗し、他のケースにジャンプする理由だと思います。 req.file.image.filenameのようにアクセスすることはできません.req.file.filenameでアクセスできます。それは既に「単一の」ファイルなので、あなたが得ていることを知るためにコンソールにreq.fileを記録してみてください。私は間違いがあなたのhtmlに

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

だと思う

更新は、HTMLのname属性はupload.singleの文字列と同じでなければなりません

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

でなければなりません。 だからあなたの場合

upload.single('image') 

に今、あなたはreq.fileでファイルを受信します。

希望します。

+0

私はまだ同じ方法を試してみました! –

+0

私の更新された回答を確認してください。 –

関連する問題