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)
      })
      
      
  • 相关阅读:
    ASP.NET MVC案例——————拦截器
    Windows Azure Virtual Network (10) 使用Azure Access Control List(ACL)设置客户端访问权限
    Windows Azure Storage (20) 使用Azure File实现共享文件夹
    Windows Azure HandBook (5) Azure混合云解决方案
    Windows Azure Service Bus (6) 中继(Relay On) 使用VS2013开发Service Bus Relay On
    Azure PowerShell (9) 使用PowerShell导出订阅下所有的Azure VM的Public IP和Private IP
    Windows Azure Service Bus (5) 主题(Topic) 使用VS2013开发Service Bus Topic
    Azure China (9) 在Azure China配置CDN服务
    Windows Azure Storage (19) 再谈Azure Block Blob和Page Blob
    Windows Azure HandBook (4) 分析Windows Azure如何处理Session
  • 原文地址:https://www.cnblogs.com/0915ty/p/14609626.html
Copyright © 2011-2022 走看看