首页 > 解决方案 > 输入验证失败时如何防止 Multer 文件上传

问题描述

我正在创建一个(POST)路由来处理文件上传,除了文件路径之外,还将一些其他属性存储到 MongoDB。问题是当输入验证失败时,文件仍然上传到 static(uploads) 文件夹中。

我正在使用 Multer 中间件进行文件上传。

设置

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

const fileFilter = (req, file, cb) => {
  if (file.mimetype === "image/jpeg" || file.mimetype === "image/png") {
    cb(null, true);
  } else {
    //rejects storing a file
    cb(null, false);
  }
};

const upload = multer({
  storage: storage,
  limits: {
    fileSize: 1024 * 1024 * 5
  },
  fileFilter: fileFilter
});

字段

const seamUpload = upload.fields([
  { name: "stylePicture", maxCount: 1 },
  { name: "materialPicture", maxCount: 1 }
]);

路线

router.post("/", [auth, seamUpload], async (req, res) => {
  const { error } = validateSeam(req.body);
  if (error) return res.status(400).send(error.details[0].message);

  const seam = new Seam({
    stylePicture: req.files["stylePicture"][0].path,
    materialPicture: req.files["materialPicture"][0].path,
    description: req.body.description,
    deliveryDate: req.body.deliveryDate,
    customer: req.body.customerId
  });

  await seam.save();

  res.send(seam);
});

客户端(邮递员)截图

标签: node.jsexpressmulterjoi

解决方案


我就像你面临这个问题一样。我发现的一种解决方案是,当您在所有模式下的身份验证似乎出错时,如果您有来自客户端的文件,您可以像这样轻松删除它:

    if(req.file) {
       fs.unlink(
             path.join(__dirname, "go to root folder that 'req.file.path' leads to the file", req.file.path),
                (err) => console.log(err));
    }

或者,如果您有多个文件,您应该对每个文件执行相同的操作。如果有,我很高兴来到这里。

我希望有另一种方法可以使用 multer 包来处理它。

祝你好运


推荐阅读