【问题标题】:Image data not saving to MongoDB图像数据未保存到 MongoDB
【发布时间】:2022-01-24 08:41:19
【问题描述】:

前言:使用 Node.js w/Express 构建博客网站并使用 multer 将图像上传到 mongoDB。

我遇到了图像数据无法保存到 MongoDB 的问题。

当我在 HTML 表单中使用 enctype="multipart/form-data 时,我在终端中得到以下信息

fieldname: 'myImage',
  originalname: 'photo_2021-12-27_20-07-58.jpg',
  encoding: '7bit',
  mimetype: 'image/jpeg',
  destination: './uploads/',
  filename: 'photo_2021-12-27_20-07-58.jpg',
  path: 'uploads\\photo_2021-12-27_20-07-58.jpg',
  size: 134172
}

这是正确的,图像也上传到单独的上传文件夹中,这也是正确的,但是图像数据没有保存到我的 mongoDB。

但是,当我删除 enctype="multipart/form-data" 时,我的终端中没有文件数据,图像也没有上传到单独的文件夹。但是我愿意!在我的 mongoDB 中获取图像数据。这是一个很奇怪的问题。有人可以帮忙吗?

另外,对于我刚刚发布的大量代码,我深表歉意。如果有人真的花时间回答这个问题,那么谢谢!

路线

const express = require('express');
const router = express.Router();
const blogController = require('../controllers/blogController')
const multer = require('multer');


const storage = multer.diskStorage({
  //destination for files
  destination: function (request, file, callback) {
    callback(null, './uploads/');
  },

  //add back the extension
  filename: function (request, file, callback) {
    callback(null, file.originalname);
  },
});


const upload = multer({
  storage: storage,
});

router.get('/create', blogController.blog_create_get);

router.get('/', blogController.blog_home);

router.post('/', upload.single('myImage') ,blogController.blog_create_post);

router.get('/:id', blogController.blog_details);

router.delete('/:id', blogController.blog_delete_post);

module.exports = router


控制器代码

const blog_create_post = (req, res) => {
  console.log(req.file);
  const blog = new Blog(req.body, {

  })

  blog.save()
    .then(() => {
      res.redirect('/blogs')
    })
    .catch((err) => {
      console.log(err);
    })
}

架构


  image: {

    data: Buffer,
    contentType: String
   
  },


const Blog = mongoose.model('Blog', blogSchema)
module.exports = Blog;

中间件

// Static Files | Middleware
app.use(express.static('Public'));
app.use(express.urlencoded({ extended: true }));
app.use(morgan('dev'))
app.use('/uploads',express.static('uploads'))

HTML 表单

    <form action="/blogs" enctype="multipart/form-data" method="POST">
      <label for="image">Select image:</label>
      <input type="file" id="image" name="myImage" accept="image/*">
      <input type="submit" value = "Upload Photo">

【问题讨论】:

    标签: node.js mongodb express multer


    【解决方案1】:

    只有当表单的enctypeenctype="multipart/form-data" 时才会触发Multer。来自他们doc 的示例:

    <form action="/profile" method="post" enctype="multipart/form-data">
      <input type="file" name="avatar" />
    </form>
    

    当你不提供这个enctype 时,你的req 对象包含文本形式的数据,然后它当然会保存到你的数据库中。

    为了将二进制数据保存到MongoDB,您需要打开一个由指定的文件

    filename: 'photo_2021-12-27_20-07-58.jpg',
    path: 'uploads\\photo_2021-12-27_20-07-58.jpg',
    

    并将其适当地保存(作为文本或二进制文件,具体取决于格式和请求)到 mongodb。要读取文件,请检查此answer

    【讨论】:

      猜你喜欢
      • 2021-05-05
      • 2023-03-23
      • 2018-08-11
      • 1970-01-01
      • 2021-06-20
      • 2020-08-10
      • 1970-01-01
      相关资源
      最近更新 更多