使用formidable做node的文件上传,并利用iframe让表单提交不跳转

使用formidable做node的文件上传,并利用iframe让表单提交不跳转

  • 今天做功能做到了文件上传、之前做过img的上传是用的h5的fileReader对象转base64上传 遇到纯数据文件上传确实做的时候遇到了很多问题

  • 开始的时候想的用ajax传(以前base64就是长字符串、可以用ajax),发现ajax只能传字符串、不然就要引用插件、对于现在的项目来说、引入插件也会变得冗余、所以寻求一个其他的方法

  • 先没管那么多、先用表单传过去看看吧、发现传文件流需要给from表单一个比较重要的属性enctype=”multipart/form-data”

  • 这里是前台代码v-on:change的方法可以理解成onchange触发submit()

<form id="fileForm" method="post" action="/data/import" enctype="multipart/form-data" >
    <a href="#" class="btn btn-primary uploaderBtn">
            上传
        <input type="file" id="test" name="files" v-on:change="importData('fileForm')"/>
    </a>
</form>
  • 提交之后、node这边应该用我们的主角formidable抓取请求了

  • 首先install这一步是一定的

npm install formidable --save-dev
//fs文件操作模块(可选项)
npm install formidable --save-dev
  • 用require的方式引入
var formidable = require('formidable');
var fs = require('fs');
  • 方法中我们要先new一个formidable对象并设置他的属性
var form = new formidable();
form.encoding = 'utf-8';        //设置编辑
form.uploadDir = 'static'     //设置上传目录
form.keepExtensions = true;     //保留后缀
form.maxFieldsSize = 2 * 1024 * 1024;   //文件大小
  • 调用form.parse()方法
form.parse(req, (err, fields, files)=>{

    if (err) {
      console.log("文件上传报错"+err);
      res.send(err);        
    }
    //这里我把上传的文件读取出来
    var data = fs.readFileSync(files.files.path,'utf-8');
    //你要做的操作
    ...
}
  • 到了这一步、上传可以实现了、但是前台传完文件之后会跳转到action的地址、这对于我来说是不想看到的

  • 所以便有了iframe的出现

<iframe name="testIframeName" style="display:none;"></iframe>
<form target="testIframeName" id="fileForm" method="post" action="/data/import" enctype="multipart/form-data" >
    <a href="#" class="btn btn-primary uploaderBtn">
        上传
        <input type="file" id="test" name="files" v-on:change="importData('fileForm')"/>
    </a>
</form>
  • 改写了一下前台页面、加入了一个iframe并且把他们用target链接到一起、意义在于、form提交之后、iframe去跳转、form表单不会跳转、iframe是看不见的、所以达到了简单实现我们要的效果