当前位置:   article > 正文

vue 文件导入导出/上传下载并与后端交互操作_vue 导出文件传对象

vue 导出文件传对象

上传/导入

1、前端解析文件处理后再传递
依赖—解析文件

import Papa from 'papaparse'

html

  1. <div class="_importIn">
  2.   <img title="导入文件" src="../../assets/image/tech/importIn.png" alt="">
  3.   <!--css中将导入文件隐藏在导入图片上,即通过绝对定位使input与img重合,且input在上opacity为0-->
  4.   <input title="导入文件" type="file" @change="upFile" ref="importIn" accept=".csv">
  5. </div>

js

  1. //导入文件,csv文件类型为例
  2. upFile(){
  3.     let dom = this.$refs.importIn;
  4.     let file = dom.files[0];
  5.     let name = file.name.split('.');
  6.     //console.log(dom)
  7.     let type = name[name.length-1];
  8.     if(type!='csv'&&type!='CSV'){    //或者直接ile.type === '.../...';
  9.         this.$message({
  10.             type:'warning',
  11.             message:`请导入csv文件`
  12.         })
  13.         return;
  14.     }
  15.     let _this =this;
  16.     let data=[]
  17.     if(file){
  18.         // csv
  19.         Papa.parse(file,{    //解析
  20.             complete:results => {
  21.                 let arr  = JSON.parse(JSON.stringify(results.data))
  22.                 //console.log(arr)
  23.                 let index=0;
  24.                 arr.splice(0,1)    //删掉列名
  25.                 arr.forEach((x,ind) => {
  26.                     if(x.length>=4){
  27.                         let obj = {
  28.                             unit_name:x[0],
  29.                             unit_area:x[1],
  30.                             unit_industry:x[2],
  31.                             unit_url:x[3].split(','),
  32.                     } else if(x.length>1&&x.length<4){    //可会会解析出空行,数据为['']
  33.                         console.log(x)
  34.                         index++;
  35.                     }
  36.                 })
  37.                 if(index>0){
  38.                     this.$message({
  39.                         type:'warning',
  40.                         message:`请检查导入格式是否符合导出格式`
  41.                     })
  42.                     return;
  43.                 }
  44.                 _this.addPoint(data)    //传输数据
  45.             }
  46.         })
  47.         dom.value = null //清空input内容。若不清空同一个文件再次上传不会触发input change事件
  48.     }
  49. },



2、element-ui + 直接传文件到后台

采用的是element-ui 组件,如果对绑定的属性存在疑问可以去 官网查询

html

  1. <el-upload class="upload-demo" :http-request="uploadImg" action=""
  2.     :on-preview="handlePreview"
  3.     :on-remove="handleRemove"
  4.     :on-change="handleChangeVideo"
  5.     :before-upload="beforeAvatarUploadVideo"
  6.     multiple 
  7.     :limit="1"
  8.     :file-list="addform.video"
  9.     >
  10.     <!-- v-model="addform.video" -->
  11.     <span style="color: #4A90E2;font-size: 13px;margin-left: 8px;">{{attachmentName}}(.mp4)</span>
  12.     <!-- <div slot="tip" class="el-upload__tip"></div> -->
  13. </el-upload>


js

  1. handlePreview(){},
  2. uploadImg(){},
  3. handleRemove(){
  4.     this.fileList = [];
  5. },
  6. handleChangeVideo(file, fileList){
  7.     
  8.  },
  9.  //在传文件之前,返回false该文件不会加入上传列表,可以把判断类型加在这个地方
  10. beforeAvatarUploadVideo(file){
  11.     console.log(file)
  12.     let arr = file.name.split('.');
  13.     let type = arr[arr.length-1].toLowerCase();
  14.     console.log(type)
  15.     const isMP4 = type==='mp4';//file.type === 'video/mp4';
  16.     if (!isMP4) {
  17.          this.$message.error('上传视频只能是 mp4 格式!');
  18.          this.addform.video = [];
  19.     }
  20.     return isMP4;
  21. },



在数据传输到后台的时候,我们需要把文件信息传过去,需要的是file对象,但是file对象必须经过一定的处理后台才能拿到,直接传后台是不能处理的

文件对象

在这里插入图片描述


处理
首先"Content-Type": “‘multipart/form-data’”
然后传输的数据格式需要改为form data

  1. let formData = new FormData(); //文件和普通对象都可以放在里面,通过post将formData 整个传过去,传递数组/对象需要按层级append或者转为string让后端处理
  2. formData.append('screen', this.addform.screen[0]);    
  3. formData.append('report', this.addform.report[0]);

一般传输较大文件需要时间较长
所以可以做一一下提示

  1. this.isOk = true; //提交到后台的按钮是否可点击,true标识diasbled=true,不可点击
  2. //....
  3. //点击提交后按钮不可点击
  4. var msg = this.$message({
  5.     message: '文件传输中,请等待...',
  6.     type: 'warning',
  7.     duration: 0,
  8. });
  9. //提交成功或失败后
  10. this.isOk = false;
  11. msg.close();



下载/导出

通过地址下载
后端需要返回相应http地址才能下载
具体的功能实现为:download=“item.video”

HTML

  1. <a v-if="item.video.indexOf('http')!=-1" class="_download" :href="`${item.video}`"  target="_blank" :title="item.video?item.video:''" :download="item.video" >
  2.     <i class="el-icon-document"></i>
  3.     <span style="color: #000">{{item.video.split('/')[4]}}</span>
  4. </a>


或者直接

  1. var a = document.createElement('a');
  2. let fileName = ''    //文件名
  3. a.    setAttribute('download', fileName);// download属性,值为下载保存的文件名称
  4. // 根据后台的地址下载
  5. a.setAttribute('href', `${this.$ip}${res.uri}`);
  6. a.click();// 自执行点击事件



前端导出

  1. exportCSV(){ //导出CSV
  2.    //生成文件
  3.    let arr = ['名称,区域,行业,地址'];    //第一行,列名。csv文件会默认根据逗号分割成列
  4.    let data = this.list;    //需要导出的列表
  5.    
  6.    for(let i=0;i<data.length;i++){
  7.        let temp = [];
  8.        temp.push(data[i].name)    //每一列
  9.        temp.push(data[i].area)
  10.        temp.push(data[i].industry)
  11.        temp.push("\""+data[i].url.join(',')+"\"")    //数组的处理,不处理一个数组会分散到多个列
  12.        arr.push(temp.join(','));    //添加每一行的内容
  13.    }
  14.    console.log(arr)
  15.    let content = "data:text/csv;charset=utf-8,\ufeff" + arr.join('\n');    //文件格式+文件内容,\n换行
  16.    //下载文件
  17.    var link = document.createElement("a");
  18.    link.setAttribute("href", content);
  19.    link.setAttribute("download", "unit.csv");
  20.    link.click();
  21. },


————————————————
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/171269
推荐阅读
相关标签