【问题标题】:I cannot display the image that is uploaded and saved in database我无法显示上传并保存在数据库中的图像
【发布时间】:2020-07-07 22:16:46
【问题描述】:

我正在尝试使用multer、mongoose 和express 上传图像。上传的图像保存在MongoDB 数据库中,但我稍后无法显示。它说找不到指定的文件并在console 中给出404 error 这是我的app.js:

var express = require("express"), 
app = express(),
bodyParser = require("body-parser"),
mongoose = require("mongoose");
var multer = require('multer')

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, 'uploads')
  },
  filename: function (req, file, cb) {
    cb(null, Date.now() + file.originalname);
  }
})  

var upload = multer({ storage: storage, 
    limit: {
        fileSize: 5000 * 5000 * 60
    },
    fileFilter: fileFilter
});

var fileFilter = (req, file, cb) => {
    if(file.mimetype === 'image/jpeg' || file.mimetype === 'image/png') {
        cb(null, true);
    } else {
        cb(null, false);
    }
};

mongoose.connect("mongodb://localhost/restfulblog", {useNewUrlParser: true, useUnifiedTopology: true, useFindAndModify: false});

app.set("view engine", "ejs");
app.use(express.static("public"));
app.use("uploads/", express.static("uploads"));
app.use(bodyParser.urlencoded({extended: true}));
app.use(sanitizer());
app.use(methodOverride("_method"));


var blogSchema = new mongoose.Schema({
    title:      String,
    image:      String,
    body:       String,
    createDate: {type: Date, default: Date.now}
});

var blog = mongoose.model("blog", blogSchema);

app.get("/", function(req, res) {
    res.redirect("/blogs");
})

// 1 INDEX ROUTE
app.get("/blogs", function(req, res) {
    blog.find({}, function(err, blogs) {
        if(err) {
            console.log(err);
        } else {
            res.render("index", {blogs: blogs});
        }
    });
});

// 2 NEW ROUTE
app.get("/blogs/new", function(req, res) {
    res.render("new");
});

// 3 CREATE ROUTE
app.post("/blogs", upload.single("image"), function(req, res) {
    console.log(req.file.path);
    var title = req.body.title;
    var image = req.file.path;
    console.log(image)
    var body = req.body.body;
    var newBlog = {title: title, image: image, body: body};
    blog.create(newBlog, function(err, newBlog) {
        if(err) {
            console.log(err.message);
            res.redirect("new");
        } else {
            res.redirect("back");
        }
    });
});

这是我的 ejs 文件

<%- include("partials/header")%>
<div class="ui main text container">
    <div class="ui huge header">Naruto Blog App</div>
    <div class="ui top attached segment">
        <div class="ui divided items">
            <% blogs.forEach(function(blog) { %>
                <div class="item">
                    <div class="image">
                        <img src="<%= blog.image %>">   
                    </div>
                    <div class="content">
                        <a class="header" href="/blogs/<%= blog._id%>"><%= blog.title %></a>
                        <div class="meta">
                            <span><%= moment(blog.createDate).format('MMMM D, YYYY') %></span>
                        </div>
                        <div class="description">
                            <p><%= blog.body %>...</p>
                        </div>
                        <div class="extra">
                            <a class="ui floated orange button" href="/blogs/<%= blog._id%>">Read More <i class="hand point right outline icon"></i></a>    
                        </div>
                    </div>
                </div>
            <% }); %>
        </div>
    </div>
</div>

<%- include("partials/footer")%>

请帮我解决问题

【问题讨论】:

  • 图片上传后能在磁盘上找到吗?! console.log(req.file.path); 的输出是什么?!
  • 是的,它是持久的。并输出:{ fieldname: 'image', originalname: 'Ash and Pikachu 3 by Yodapee.png', encoding: '7bit', mimetype: 'image/png', destination: 'uploads', filename: '1585294740704Ash and Pikachu 3 by Yodapee.png', path: 'uploads\\1585294740704Ash and Pikachu 3 by Yodapee.png', size: 306617 } uploads\1585294740704Ash and Pikachu 3 by Yodapee.png uploads\1585294740704Ash and Pikachu 3 by Yodapee.png

标签: node.js web mongoose ejs multer


【解决方案1】:

查看 Express 的 static 函数,似乎根参数中的斜杠应该移到开头!我移动了它并在我的机器上测试了你的代码,它工作正常!

app.use('/uploads', express.static('uploads'));

获取 localhost:3000/uploads/testimage.jpg 返回图片!

希望我有所帮助

【讨论】:

  • 还有一件事,我可以通过使用 Postman 来做到这一点,但我忘了提及。如何通过网页进行操作?
  • @Shinnen 使用 img 标签,例如&lt;img src="/uploads/testimage.jpg" height="100" width="150"/&gt;。如果前端文件位于不同的项目中,则将主机添加到路径 src="localhost:3000/uploads/testimage.jpg" 旁边。随时:)
猜你喜欢
  • 2014-08-09
  • 1970-01-01
  • 2020-06-05
  • 2019-03-19
  • 2021-12-28
  • 2019-09-20
  • 2020-05-13
  • 2019-02-22
  • 1970-01-01
相关资源
最近更新 更多