【问题标题】:Handle Multer fileSize error when uploading large files上传大文件时处理 Multer fileSize 错误
【发布时间】:2021-09-16 23:10:39
【问题描述】:

我在我的服务器上使用 multer 上传文件,而在使用 limits: { fileSize: 3000000 } 上传时,我将文件大小限制为 3MB。现在我面临的问题是,当上传更大的文件时,我收到MulterError: File too large at abortWithCode 错误,并且我的服务器正在中止并崩溃。我尝试使用if (err instanceof multer.MulterError) { console.log("file too large")} 并使用upload 作为中间件来处理错误,但它似乎不起作用,当上传更大的文件时我的服务器不断崩溃。知道如何处理错误情况吗???我不希望我的服务器崩溃并将错误作为对 API 的响应发送出去

路由器:

const multer = require("multer");

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

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

module.exports.setRouter = (app) => {
  app.post("/create", upload.single("imageUrl"), userController.createUser);
}

控制器功能:

let createUser = (req, res) => {
  let newUser = new UserModel({
    name: req.body.name,
    email: req.body.email,
    password: passwordLib.hashpassword(req.body.password),
    imageUrl: req.file.path,
  });

  // saving the new user
  newUser.save((err, result) => {
    if (err) {
      console.log(err);
      res.send(err);
    } else {
      res.send(result);
    }
  });
};

app.js

const express = require("express");
const app = express();
app.use("/uploads", express.static("uploads"));

【问题讨论】:

    标签: node.js express file-upload multer


    【解决方案1】:

    您可以使用在multer 之后执行的附加错误处理程序来捕获错误。

    const multer = require('multer')
    const fileSizeLimitErrorHandler = (err, req, res, next) => {
      if (err) {
        res.send(413)
      } else {
        next()
      }
    }
    
    const storage = multer.diskStorage({
      destination: function(req, file, cb) {
        cb(null, './uploads')
      },
      filename: function(req, file, cb) {
        cb(null, Date.now() + file.originalname)
      },
    })
    
    const upload = multer({ storage: storage, limits: { fileSize: 2000000 } })
    
    module.exports.setRouter = (app) => {
      app.post('/create', upload.single('imageUrl'), fileSizeLimitErrorHandler, userController.createUser)
    }
    

    【讨论】:

    • 它解决了我的问题。文件大小限制已处理。
    【解决方案2】:

    使用这个

    const upload = multer({ storage: storage,
                            limits: { fileSize: 2000000 },
                            fileFilter: function(req, file, cb){
                                checkFileType(file, cb)
                            }
                            });
    
    
    
    
    function checkFileType(file, cb){
        // Allowed ext
        const filetypes = /jpeg|jpg|png/;
    
        //check ext
        const extname = filetypes.test(path.extname(file.originalname).toLowerCase());
    
        //check mime
        const mimetype = filetypes.test(file.mimetype);
    
        if(mimetype && extname){
            return cb(null, true);
        }else{
            cb('Error')
        }
    }
    

    控制器

    let createUser = (req, res) => {
        upload(req, res, (err) => {
        if (err) res.send(err);
        })
    
    //the rest (saving new user) here
    };
    

    【讨论】:

    • 如何将此“错误”作为 API 响应发送
    猜你喜欢
    • 2016-09-14
    • 2015-08-30
    • 2018-05-27
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 2021-08-16
    相关资源
    最近更新 更多