【问题标题】:stop the file upload in multer if the user validation fails如果用户验证失败,则在 multer 中停止文件上传
【发布时间】:2016-04-22 02:16:25
【问题描述】:

文件上传是multer使用此代码完成的,但是当用户验证失败时如何停止文件上传。这段代码中用户验证部分在哪里写

router.post('/profilePicture',
 multer({dest: './uploads/',
rename: function (fieldname, filename,req,res) {
      return image = req.body.userId+'-'+dateTime+'-'+randomId();
    },
    onFileUploadStart: function (file,req,res) {
        if(file.mimetype !== 'image/jpg' && file.mimetype !== 'image/jpeg' && file.mimetype !== 'image/png') {
          imageUploadDone = false;
          return false;
        }
        //console.log(file.originalname + ' is starting ...');
    },
    onFileUploadComplete: function (file,req,res) {
      //console.log(file.fieldname + ' uploaded to  ' + file.path);
      if(file.mimetype == 'image/jpg')
        extn  = '.jpg';
      if(file.mimetype == 'image/jpeg')
        extn  = '.jpeg';
      if(file.mimetype == 'image/png')
        extn  = '.png';
      imageUploadDone=true; 
    }
}),function(req, res) { 
      upload(req,res,function(err) {
    if(imageUploadDone==true){
      //console.log(image);
      var userInfo = {'userId':req.body.userId,'newImage':address+image+extn,'path':'./uploads/'};
          db.profilePicture(userInfo,function(result){
            if(result.message == 'image path added'){
              res.json({'success':'1','result':{'message':'Profile Picture Updated','imageUrl':address+image+extn},'error':'No Error'});
            }
          });
    }
    if(imageUploadDone == false){
    res.json({'success':'0','result':{},'error':'file format is not supported'});
  }
  });
});

我尝试在 onFileUploadStart 和 onFileUploadComplete 等事件上验证用户。如果用户仍然无效,则文件将上传到路径。

【问题讨论】:

标签: node.js express multer


【解决方案1】:

您可以做些什么来验证文件的格式:在您的 app.js 中放入此代码

const multer = require('multer');

/* defined storage and filename */
const fileStorage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, "images");
  },
  filename: (req, file, cb) => {
    cb(null, new Date().toISOString() + "-" + file.originalname);
  }
});

/* defined filter */
const fileFilter = (req, file, cb) => {
  if (
    file.mimetype === "image/png" ||
    file.mimetype === "image/jpg" ||
    file.mimetype === "image/jpeg"
  ) {
    cb(null, true);
  } else {
    cb(new Error("File format should be PNG,JPG,JPEG"), false); // if validation failed then generate error
  }
};

app.use(
  multer({ storage: fileStorage, fileFilter: fileFilter }).single("image")
);

现在,每当您的文件通过“图像”键上传时,都会检查其格式,如果不满足,则会生成错误。

希望这对某人有所帮助!

【讨论】:

    【解决方案2】:

    这现在可以在 1.0.0 中实现。

    如果您想中止上传:

    multer({
          fileFilter: function (req, file, cb) {
             if (path.extname(file.originalname) !== '.pdf') {
                     return cb(new Error('Only pdfs are allowed'))
              }
    
             cb(null, true)
           }
     })
    

    如果您想跳过任何不是 pdf 的文件:

    multer({
          fileFilter: function (req, file, cb) {
              if (path.extname(file.originalname) !== '.pdf') {
                      return cb(null, false)
           }
    
          cb(null, true)
          }
     })
    

    【讨论】:

    • 根据用户可以轻松更改的文件扩展名进行验证不是一个好习惯。 Multer 为每个不能伪造的文件提供mimetype。所以,我认为使用file.mimetype 会更安全。
    【解决方案3】:

    解决此问题的另一种方法。

    const path = require('path');
    multer({
      fileFilter: function (req, file, cb) {
    
    var filetypes = /jpeg|jpg/;
    var mimetype = filetypes.test(file.mimetype);
    var extname = filetypes.test(path.extname(file.originalname).toLowerCase());
    
    if (mimetype && extname) {
      return cb(null, true);
    }
    cb("Error: File upload only supports the following filetypes - " + filetypes);
    }
    
    });
    

    在下面的链接上有关于这个问题的进一步讨论。 https://github.com/expressjs/multer/issues/114

    【讨论】:

      【解决方案4】:

      如果您想进行文件相关的验证,即 mime 类型或文件大小,您可以使用 fileFilter 进行此操作。

      multer({
          fileFilter: function(req, file, cb) {
             // file validation...
          }
      });
      

      上述方法的唯一问题是您无法对请求的正文进行验证。 req.bodyfileFilter 回调中是空的,如 Github issue 中所述。

      有一个解决方法,在这个 Github issue 中有描述。这不是 IMO 的最佳解决方案,因为它强制客户确保验证。

      另一种选择是保存文件,然后对req.body 进行验证检查,如果请求无效,您可以使用delrimraf 之类的方法从磁盘中删除持久文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-20
        • 1970-01-01
        • 2015-08-17
        • 2019-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-22
        相关资源
        最近更新 更多