前端导入导出各类型文件总结

636 阅读4分钟

这里以 element-plus 举例

一、导出

  • 在组件里点击按钮导出文件
<el-button style="margin-right: 0.625rem" type="primary" :icon="Download" @click="exportFile">
  导出
</el-button>

// 引入导出文件方法
  import { exportExcel } from '@/utils/exportUtil';
// 导出
  const exportFile = async () => {
    const result = await http_exportLanding();
    if (result) {
      ElMessage({
        type: 'success',
        message: '正在导出,请稍后',
      });
      exportExcel(result, '起降费');
    }
  };
  • 在 utils 里面写导出文件的方法,关键是这个 type,代表了导出文件的格式,示例里面导出的是 excel 表格
// utils/exportUtil
/**
 *
 * @param {*} stream 文件流
 * @param {*} fileName 文件名
 */
// 导出文件为Excel
export function exportExcel(stream, fileName) {
  const pdfStream = new Blob([stream], {
    type: 'application/vnd.ms-excel',
  });
  const url = URL.createObjectURL(pdfStream);
  const link = document.createElement('a');
  link.href = url;
  link.setAttribute('download', fileName);
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
}

  • 在网络请求这里,需要将响应类型改为二进制流
// 导出起降费
export const http_exportLanding = params =>
  API.get('/api/navigation/daoChuLandingFee', params, { responseType: 'blob' });

二、导入

  • 在组件里点击按钮导出文件
      <el-upload
        class="upload"
        action="#"
        :show-file-list="false"
        :auto-upload="false"
        multiple
        :on-change="handleChange"
        :http-request="uploadApproval"
      >
        <el-button type="primary" :icon="Upload">导入</el-button>
      </el-upload>
      
      // 导入起降费
        const handleChange = file => {
          uploadApproval(file);
        };
        
        const uploadApproval = async option => {
          const fd = new FormData();
          fd.append('file', option.raw);
          const res = await http_importLanding(fd);
          if (res.code === 0) {
            ElMessage.success('导入起降费文件成功');
          } else if (res.code === -1) {
            ElMessage.warning('导入起降费文件失败');
          }
        };

  • 在网络请求这里,需要将请求头改掉,因为POST请求时发送 FormData 类型的数据会将设置 multipart/form-data
// 导入起降费
export const http_importLanding = data =>
  API.post('/api/navigation/daoRuLandingFee', data, {
    headers: {
      'Content-Type': 'multipart/form-data',
    },
  });

三、FormData

此部分来源简书,作者:张培跃,链接:www.jianshu.com/p/e984c3619…

FormData的主要用途有两个:
1、将form表单元素的name与value进行组合,实现表单数据的序列化,从而减少表单元素的拼接,提高工作效率。
2、异步上传文件
1、创建一个空对象:
//通过FormData构造函数创建一个空对象
var formdata=new FormData();
//可以通过append()方法来追加数据
formdata.append("name","laotie");
//通过get方法对值进行读取
console.log(formdata.get("name"));//laotie
//通过set方法对值进行设置
formdata.set("name","laoliu");
console.log(formdata.get("name"));//laoliu
2、通过表单对formData进行初始化
  • 创建表单:
<form id="advForm">
    <p>广告名称:<input type="text" name="advName"  value="xixi"></p>
    <p>广告类别:<select name="advType">
        <option value="1">轮播图</option>
        <option value="2">轮播图底部广告</option>
        <option value="3">热门回收广告</option>
        <option value="4">优品精选广告</option>
    </select></p>
    <p><input type="button" id="btn" value="添加"></p>
</form>
  • 通过表单元素作为参数,实现对formData的初始化:
//获得表单按钮元素
var btn=document.querySelector("#btn");
//为按钮添加点击事件
btn.onclick=function(){
    //根据ID获得页面当中的form表单元素
    var form=document.querySelector("#advForm");
    //将获得的表单元素作为参数,对formData进行初始化
    var formdata=new FormData(form);
    //通过get方法获得name为advName元素的value值
    console.log(formdata.get("advName"));//xixi
    //通过get方法获得name为advType元素的value值
    console.log(formdata.get("advType"));//1 
}

二、操作方法

1、通过get(key)与getAll(key)来获取相对应的值
// 获取key为age的第一个值
formdata.get("age"); 
 // 获取key为age的所有值,返回值为数组类型
formdata.getAll("age");
2、通过append(key,value)在数据末尾追加数据
//通过FormData构造函数创建一个空对象
var formdata=new FormData();
//通过append()方法在末尾追加key为name值为laoliu的数据
formdata.append("name","laoliu");
//通过append()方法在末尾追加key为name值为laoli的数据
formdata.append("name","laoli");
//通过append()方法在末尾追加key为name值为laotie的数据
formdata.append("name","laotie");
//通过get方法读取key为name的第一个值
console.log(formdata.get("name"));//laoliu
//通过getAll方法读取key为name的所有值
console.log(formdata.getAll("name"));//["laoliu", "laoli", "laotie"]
3、通过set(key, value)来设置修改数据

key的值不存在,会添加一条数据

//通过FormData构造函数创建一个空对象
var formdata=new FormData();
//如果key的值不存在会为数据添加一个key为name值为laoliu的数据
formdata.set("name","laoli");
//通过get方法读取key为name的第一个值
console.log(formdata.get("name"));//laoli

key的值存在,会修改对应的value值

//通过FormData构造函数创建一个空对象
var formdata=new FormData();
//通过append()方法在末尾追加key为name值为laoliu的数据
formdata.append("name","laoliu");
//通过append()方法在末尾追加key为name值为laoliu2的数据
formdata.append("name","laoliu2");
//通过get方法读取key为name的第一个值
console.log(formdata.get("name"));//laoliu
//通过getAll方法读取key为name的所有值
console.log(formdata.getAll("name"));//["laoliu", "laoliu2"]

//将存在的key为name的值修改为laoli
formdata.set("name","laoli");
//通过get方法读取key为name的第一个值
console.log(formdata.get("name"));//laoli
//通过getAll方法读取key为name的所有值
console.log(formdata.getAll("name"));//["laoli"]
4、通过has(key)来判断是否存在对应的key值
//通过FormData构造函数创建一个空对象
var formdata=new FormData();
//通过append()方法在末尾追加key为name值为laoliu的数据
formdata.append("name","laoliu");
//判断是否包含key为name的数据
console.log(formdata.has("name"));//true
//判断是否包含key为age的数据
console.log(formdata.has("age"));//false
5、通过delete(key)可以删除数据
//通过FormData构造函数创建一个空对象
var formdata=new FormData();
//通过append()方法在末尾追加key为name值为laoliu的数据
formdata.append("name","laoliu");
console.log(formdata.get("name"));//laoliu
//删除key为name的值
formdata.delete("name");
console.log(formdata.get("name"));//null

三、通过XMLHttpRequest发送数据

  • 创建表单:
<form id="advForm">
    <p>广告名称:<input type="text" name="advName" value="xixi"></p>
    <p>广告类别:<select name="advType">
        <option value="1">轮播图</option>
        <option value="2">轮播图底部广告</option>
        <option value="3">热门回收广告</option>
        <option value="4">优品精选广告</option>
    </select></p>
    <p>广告图片:<input type="file" name="advPic"></p>
    <p>广告地址:<input type="text" name="advUrl"></p>
    <p>广告排序:<input type="text" name="orderBy"></p>
    <p><input type="button" id="btn" value="添加"></p>
</form>
  • 发送数据:
var btn=document.querySelector("#btn");
btn.onclick=function(){
    var formdata=new FormData(document.getElementById("advForm"));
    var xhr=new XMLHttpRequest();
    xhr.open("post","http://127.0.0.1/adv");
    xhr.send(formdata);
    xhr.onload=function(){
        if(xhr.status==200){
            //...
        }
    }
}