zoukankan      html  css  js  c++  java
  • axios请求下载excel文件

    前端通过发请求,下载文件

    这里我们使用axios发送请求作讲解

    • 封装公共的导出文件的方法,针对get请求

      /*
       * @{content} 后端返回的数据
       * @{customFileName} 自定义的文件名称
       * @{type} 对应的MIME的类型 'application/vnd.ms-excel' 
       * 类型的详情可查看MDN文档 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
      */
      function exportFile (content, customFileName, type) {
          let blob = new Blob([content], {type: type || 'application/vnd.ms-excel'}) // 默认excel
          let filename = content.filename || customFileName
          let URL = window.URL || window.webkitURL
          let objectUrl = URL.createObjectURL(content)
          let a = document.createElement('a')
          a.href = objectUrl
          a.download = filename
          document.body.appendChild(a)
          a.click()
          a.remove()
      }
      
    • get 请求

      // get 请求如何将响应头中的文件名取出来, 在axios的相应拦截器中
      axios.interceptors.response.use(response => {
          let filename = response.headers['content-disposition'] && response.headers['content-disposition'].split(';')[1].split('filename=')[1]
          if (filename) {
              if (filename.indexOf('%') < 0) {
                  filename = decodeURIComponent(escape(filename))
                  response.data.filename = filename
              } else {
                  filename = decodeURIComponent(filename)
                  response.data.filename = filename
              }
          }
          return response.data
      })
      

      发送get请求并下载文件

      axios({
          url,
          method: 'get',
          params: {}, // 你需要向后端发送的数据
          responseType: 'blob', // 必须项,axios会将文件流转为blob
      }).then(res => {
        // 因为后端传回来的是文件流, 所以我们的响应头中可能会有后端设置的文件的名字,这里可以查看浏览器network对应请求的响应头, 'Content-Type': 'application/octet/stream;charset=ISO8859-1', 'Content-Disposition': attachment;filename=xxxxx', 这时候我们得到的就是一个被axios将文件流转为blob的blob实例对象
          exportFile(res.data, '测试文件.xlsx') // 这是刚刚在上面封装的公共的导出方法。
      })
      
    • post 请求

      axios({
          url,
          method: 'POST',
          data: {},
          responseType: 'blob'
      }).then(res => {
         // 目前在我们的项目中,我通过这样设置响应类型blob, 但是我接收到的还是一个字符串类型的乱码东西。没得关系,自己搞成blob
          if (Object.prototype.toString.call(res.data) === '[object String]') {
          	let len = res.data.length
              let buffer = new ArrayBuffer(len)
              let unitArrayBuffer = new Unit8Array(buffer)
              for (var i = 0; i < len; i++) {
                  unitArrayBuffer[i] = String.prototype.charCodeAt.call(res.data, i)
              }
              let blob = new Blob([buffer], {type: 'applicaiton/vnd.ms-excel'})
              let fileName = '自定义的文件名.xlsx'
              exportFile(blob, fileName) // 在上面定义的公共的导出方法
          }
          
      })
      
    • 将后端返回的json数据在前端转为excel文件

      // 需要使用一个库 xlsx   需要进行安装, 可使用npm  npm i xlsx -S
      import XLSX from 'xlsx'
      axios({
          url,
          method: 'POST|GET',
      }).then(res => {
          // res.data =>  [{name: 'fwt', age: 12}, {name: 'fwt1', age: 14}, {name: 'fwt2', age: 18}]
          const fileName = '自定义的文件名.xlsx'
          let wsName = 'SheetJs'
          let wb = XLSX.utils.book_new()
          let ws = XLSX.utils.json_to_sheet(res.data)
          XLSX.utils.book_append_sheet(wb, ws, wsName)
          XLSX.writeFile(wb, fileName)
      })
      
      
  • 相关阅读:
    【字符编码】字符编码 && Base64编码算法
    【JVM】JVM系列之执行引擎(五)
    【JVM】JVM系列之类加载机制(四)
    【JVM】JVM系列之Class文件(三)
    【知识积累】DES算法之C#加密&Java解密
    appium多机并行测试
    Jenkins 传递自定义的参数
    python对ftp进行操作
    Linux下ftp服务器搭建
    appium +ios 判断元素是否存在,排除visible=“false”的数据
  • 原文地址:https://www.cnblogs.com/0915ty/p/14609626.html
Copyright © 2011-2022 走看看