【问题标题】:Uploading image and video into a form to create an object将图像和视频上传到表单中以创建对象
【发布时间】:2022-01-02 14:35:03
【问题描述】:

希望你一切顺利。

我有一个关于我的 Node.js 后端应用程序的问题。我正在尝试上传图片和视频,但出现此错误:

“错误”:邮递员上的“意外字段”

这是我的代码:

create:(req,res)=>{
        console.log("Test1");
        
        console.log("Test1bis");
        //const exercise=JSON.parse(req.body.exercise);
        //delete exercise._id;
        console.log("Test2")
        var exerciseB = new Exercise({
            ...req.body,
            image:`${req.protocol}://${req.get('host')}/images/exercise/${req.file.filename1}`,
            video:`${req.protocol}://${req.get('host')}/videos/exercise/${req.file.filename2}`
        })
        console.log("Test3")

        exerciseB.save((err,exercise)=>{
            if(err){
                console.log("C'est le 2eme err");
                return res.status(500).json({
                    status:500,
                    message:err.message
                })
            }
            console.log("Ca arrive jusqu'au 200");
            return res.status(201).json({
                status:200,
                message:"Exercise Created Successfully !"
            })
        })
    }

这是我用来在单独文件中生成图像的 multer 文件(我在视频中使用了类似的 multer):

const multer=require('multer');

const MIME_TYPES={
    'image/jpg':'jpg',
    'image/jpeg':'jpg',
    'image/png':'png'
}

const storage=multer.diskStorage({
    destination:(req,file,callback)=>{
            callback(null,'public/images/exercise');
    },
    filename1:(req,file,callback)=>{
        var name=Math.floor(Math.random()*Math.floor(123456789)).toString();
        name+=Math.floor(Math.random()*Math.floor(123456789)).toString();
        name+=Math.floor(Math.random()*Math.floor(123456789)).toString();
        name+=Math.floor(Math.random()*Math.floor(123456789)).toString();
        name+=Date.now()+".";
        const extension=MIME_TYPES[file.mimetype];
        name+=extension;

        callback(null,name)
    }



})

module.exports=multer({storage}).single('image');

这是我的邮递员截图:

这是我的另一个 multer 视频文件:

const multer=require('multer');

const MIME_TYPES={
    'video/mp4':'mp4',
    'video/mpeg':'mpeg',
    'video/ogg':'ogv',
    'video/mp2t':'ts',
    'video//webm':'webm',


}

const storage=multer.diskStorage({
    destination:(req,file,callback)=>{
            callback(null,'public/videos/exercise');
    },
    filename2:(req,file,callback)=>{
        var name=Math.floor(Math.random()*Math.floor(123456789)).toString();
        name+=Math.floor(Math.random()*Math.floor(123456789)).toString();
        name+=Math.floor(Math.random()*Math.floor(123456789)).toString();
        name+=Math.floor(Math.random()*Math.floor(123456789)).toString();
        name+=Date.now()+".";
        const extension=MIME_TYPES[file.mimetype];
        name+=extension;

        callback(null,name)
    }



})

module.exports=multer({storage}).single('video');

这是我的路线文件:

var express = require('express');
var router = express.Router();
var exerciseController = require('../controllers/exerciseController');
const multerImage=require('../middlewares/multer-image');
const multerVideo=require('../middlewares/multer-video');

/* GET home page. */
router.get('/show', exerciseController.show);

router.post('/create',multerImage, multerVideo, exerciseController.create);

router.put('/update/:id',multerImage, exerciseController.update);

module.exports = router;

我认为我无法按照我在第二个路由器调用的路由文件中的方式进行操作。

希望你能帮助我!谢谢你也尝试:)

【问题讨论】:

    标签: node.js image file upload


    【解决方案1】:

    删除这一行

    module.exports=multer({storage}).single('image');
    

    并设置这一行,因为图像不是你的名字 filename1/filename2 你的图像名称

    module.exports=multer({storage}).single('filename1');
    

    这是正在运行的代码,但请确保您已经创建了公共/上传目录,编辑上传位置并上传多个文件

    const express = require('express');
    const bodyParser = require('body-parser');
    const multer = require('multer');
    const app = express();
    app.use(bodyParser.urlencoded({ limit: '10mb', extended: true }))
    app.use(bodyParser.json({ limit: '10mb', extended: true }))
    app.use(express.static('public/uploads'))
    var storage = multer.diskStorage({
       destination: function (req, file, cb) {
          cb(null, "public/uploads")
       },
       filename: function (req, file, cb) {
          cb(null, file.originalname);
       }
    })
    app.post('/', (req, res) => {
       const upload = multer({ storage: storage }).single('image_url');
       upload(req, res, function (err) {
          if (err) {
             console.log(err)
             return
          }
          var exerciseB = new Exercise({
             ...req.body,
             image: `${req.protocol}://${req.get('host')}/images/exercise/${req.file.originalname}`,
             video: `${req.protocol}://${req.get('host')}/videos/exercise/${req.file.originalname}`
          })
          exerciseB.save((err, exercise) => {
             if (err) {
                console.log("C'est le 2eme err");
                return res.status(500).json({
                   status: 500,
                   message: err.message
                })
             }
             console.log("Ca arrive jusqu'au 200");
             return res.status(201).json({
                status: 200,
                message: "Exercise Created Successfully !"
             })
          })
       })
    })
    app.listen(9001, () => {
       console.log(`listening on port ${9001}`)
    });
    

    【讨论】:

    • 我试过了,但它并没有改变输出。谢谢你?
    • import multer from 'multer' const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, "public/uploads") }, filename: function (req , file, cb) { cb(null, file.originalname); } }) export default multer({ storage: storage }) 您创建上述单独的函数并导入您的路由文件,例如: import upload from '../utils/ file.handler' 并将其传递给您的路线,例如: route.post('/upload/image', upload.single('image-name'), uploadController.uploadFunc) "image-name" 是您的邮递员 "image" 键你在那里上传 png.png
    • 我完全按照你告诉我的做,得到了同样的错误。
    猜你喜欢
    • 1970-01-01
    • 2015-12-20
    • 2020-12-26
    • 2015-01-27
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    相关资源
    最近更新 更多