node 使用formidable模块 上传图片

日期: 2017-11-08         浏览量: 3026

formidable模块简介

formidable(node-formidable)是一个Node.js form数据解析模块,非常适合用于文件上传的处理。


安装formidable模块



npm install formidable --save



初始化与数据解析


调用要IncomingForm()构造函数初始模块.

Node.js对HTTP请求的处理是,用户将请求数据封装到req对象中,对象该一个的英文IncomingMessage对象实例。formidable解析用户上传数据也就是对这个对象的解析,初始化后可以通过实例的.parse方法来解析数据。

用户当使用form表单提交数据时,表单中可能会包含两类数据:文件/图片数据,表单普通数据,formidable解析后,这会将两种数据分别放到files和fields两个回调参数中。


代码



const formidable = require('formidable');

exports.uploadFile = (req ,res ,next) =>{
  let form = new formidable.IncomingForm();
  form.keepExtensions = true;
  form.parse(req, function(err , fields, files){
      //文件储存目录
      let dirpath = 'public/upload/file/';
      //创建多层目录文件(请查看“多层目录创建”)
      if(!mkdirSync(dirpath,'777')){
          res.json({code:-1,message:'服务器繁忙!'})
      }
      //接受数据并保存
      let objUrl = _fileParse(files,dirpath);
 })
}



//文件保存到本地
function _fileParse(files,dirpath){
    let keys = Object.keys(files);
    let obj = [];
    keys.forEach(function(key){
        let filePath = files[key].path;
        let fileExt = filePath.substring(filePath.lastIndexOf('.'));
        if (('.jpg.jpeg.png.gif').indexOf(fileExt.toLowerCase()) === 0){
            //以当前时间戳对上传文件进行重命名
            let fileName = new Date().getTime()+key+ fileExt;
            let targetFile = dirpath+'/'+fileName;
            //保存文件
            let readStream = fs.createReadStream(filePath);
            let writeStream = fs.createWriteStream(targetFile);
            readStream.pipe(writeStream);
            //修改路径相对路径
            obj.push(targetFile);
        }
    });
    return obj;
}