上传大文件时处理 Multer fileSize 错误

sur*_*dey 6 file-upload node.js express multer

我在服务器上使用 multer 上传文件,在使用 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);
}
Run Code Online (Sandbox Code Playgroud)

控制器功能:

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);
    }
  });
};
Run Code Online (Sandbox Code Playgroud)

应用程序.js

const express = require("express");
const app = express();
app.use("/uploads", express.static("uploads"));
Run Code Online (Sandbox Code Playgroud)

303*_*303 12

您可以使用之后执行的附加错误处理程序来捕获错误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)
}
Run Code Online (Sandbox Code Playgroud)


Moh*_*mad 0

用这个

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')
    }
}
Run Code Online (Sandbox Code Playgroud)

控制器

let createUser = (req, res) => {
    upload(req, res, (err) => {
    if (err) res.send(err);
    })

//the rest (saving new user) here
};
Run Code Online (Sandbox Code Playgroud)