记一次node服务端文件校验历程_request.files读取文件属性

出于某种不可描述的需求,需要在服务端校验上传的文件类型和大小,由于之前没接触过node,就开始了愉快的踩坑之旅。

坑一:request.on()事件不执行

因为接收到了request请求,首先希望通过request的on事件监听data事件,达到统计数据大小的目,先看代码:

router.post("/upload", async (req, res) => {
      logger.info("Request Comming In", req.files.length);
      req.on('data', (chunk) => {
        dataSize += chunk.length;
        logger.info("${chunk.length} bytes of data comming in, ${dataSize} bytes has received");
      });
      req.on("end", () => {
        logger.info("${dataSize} bytes data received in total");
        res.sendStatus(200);
      });
});

然而测试发现,以上on事件完全没有执行,菜鸟表示不懂,欢迎大佬指教;

坑二:formidable.on()事件不执行

后来又百度到了formidable,于是就寄希望于它,当然,依旧踩坑了:

router.post("/upload", async (req, res) => {
      logger.info("Request Comming In", req.files.length);
      var form = new formidable.IncomingForm();
      form.on('file', (field, file) => {
// xxxx
      });
      form.on("field", (field, value) => {
// xxxx
      });
});

真的想不通,难不成这些事件被监听之前没有emit?菜鸟不懂,也不敢问,但记得formidable还有的个parse方法,再来一试。

坑三:formidable.parse()事件无数据

router.post("/upload", async (req, res) => {
      var form = new formidable.IncomingForm();
      form.parse(req, function (err, fields, files) {
        if (err)  res.sendStatus(500);
        logger.info("fields:\n", JSON.stringify(fields));
        logger.info("files:\n", JSON.stringify(files));
    } 
});

无奈,通过打印的日志发现,fields和files全是空的,我太难了。。。此处附上formidable的简单介绍:
https://www.cnblogs.com/Trr-984688199/p/6285958.html?utm_source=itdadao&utm_medium=referral
可是问题依旧是要解决的呀!

灵光一闪解决之道:request.files

我突然想到,之前通过JSON.stringify打印request的时候报错了,但同样的方法打印request.body是可以的,要是request里面存在file这样的字段了呢?随便一试,果然有request.files!打印,其结构如下
[{"fieldname":"my_file_name","originalname":"wo-tai-nan-le.jpg","encoding":"7bit","mimetype":"image/jpeg","buffer":{"type":"Buffer","data":[255,216,255....]}}]
参考files的数据结构,解决问题就不难了。

你可能感兴趣的:(记一次node服务端文件校验历程_request.files读取文件属性)