后台数据流导出excel表,预览pdf分享

## 后台返回数据流格式,前端进行处理,然后excel导出或者pdf预览
* 前端请求代码
  与其他请求不一样的地方,responseType: 'blob'
  请求后台返回的res.data就直接是数据流的形式

  ![avatar](./images/blob.png)

  * 前端处理blob数据类型
  
  ```
    export function getObjectURL(data) {
      let url = null
      if (window.createObjectURL !== undefined) { // basic
        url = window.createObjectURL(data)
      } else if (window.webkitURL !== undefined) { // webkit or chrome
        url = window.webkitURL.createObjectURL(data)
      } else if (window.URL !== undefined) { // mozilla(firefox)
        url = window.URL.createObjectURL(data)
      }
      return url
    }
    // 导出Excel公用方法
    export function excelDown(res, name = '模版文件.xlsx', type) {
      var typ = type || 'application/x-excel'
      var blob = new Blob([res], { type: typ })
      var downloadElement = document.createElement('a')
      var href = getObjectURL(blob)
      downloadElement.href = href
      downloadElement.download = name
      document.body.appendChild(downloadElement)
      downloadElement.click() // 触发a标签的点击事件进行下载
      document.body.removeChild(downloadElement)
      window.URL.revokeObjectURL(href)
    }
  ```
    * 有时候因为后台出错,需要前端拦截提示的操作代码
   ```
    if (res.data.type === 'application/json') {
      this.$message.error(this.$t('handleFailure'))
    } else {
      const fileName = 'data-' + params.startDate + '-' + params.endDate + '-' + new Date().getTime() + '.xlsx'
      excelDown(res.data, fileName)
    }
   ```

  ```
  // 预览pdf
  export function showPdf(res) {
    var blob = new Blob([res])
    var href = getObjectURL(blob)
    // console.log('后台返回处理文件流---', href)
    window.open('/static/pdf/web/viewer.html?file=' + encodeURIComponent(href))
  }
  ```

### 预览pdf的实现相关说明
* 请求采用的是get请求,需要把传参的对象先转成base64格式
  ```
    const getAxios = (url, params, type, token) => {
      const path = url.includes('http') ? url : `${configUrl}${url}`
      return Axios({
        method: 'get',
        url: path,
        params: params,
        responseType: type
      })
    }
  ```
  ```
    printnewOrder(params) {
      const url = '/api/printOrder.do'
      params.token = store.getters.token
      const str = CryptoJS.enc.Utf8.parse(JSON.stringify(params))
      const newParams = {
        requestJson: encodeURI(CryptoJS.enc.Base64.stringify(str))
      }
      // console.log('newParams--', newParams)
      return getAxios(`${configUrl}${url}`, newParams, 'blob')
    }
  ```
* 处理了后台返回的blob数据之后,得到一个pdf文件的路径,如果直接下载的话,可以通用excel表的导出方法,但是预览的话,直接打开是没法预览的,所以要借助插件的实现
* 需要的插件是pdf.js 和 viewer.js  不需要要项目中引入这两个js,其实关键的地方就是window.open的时候,借助于viewerjs里面的viewer.html,用file=的方式在新窗口打开来进行PDF的预览, 处理blob得到的地址要经过encodeURIComponent来对url进行编码
* 这里关键的地方是pdf.js, viewerjs的插件放置位置,要当成静态资源来进行编译,对于vuecli3的项目,index.html放在与src统计的public文件夹里,所以pdf.js和viewer.js相关文件需要放在public里的static文件夹里

vuecli3项目放置位置

* 如果是vuecli2的老项目,index.html直接跟index.html同级,则直接放在src同级的static目录里

vuecli2老项目示例

* vuecli3里面还有一个地方需要配置一下,才能访问到viewer.html,不然默认访问的是index.html

index.html配置

* 这样处理之后,直接本地运行项目的时候是没有问题的,但是打包部署到服务器上之后,访问不到viewer.html,这个时候这个地址就需要服务器去配置viewer.html的访问地址才可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值