Bootstrap

下载文件

一。window.open( )下载文件

1、绑定点击事件

<el-form-item>
   <el-button type="primary" size="mini" @click="getTableList"> 搜索 </el-button>
   <el-button type="primary" @click="downLoadList('phone')"> 批量下载电话单 </el-button>
   <el-button type="primary" @click="downLoadList('approval')"> 批量下载审批单 </el-button>
</el-form-item>

2、method方法中写:

downLoadList (type) {
      const url =
        type === 'phone'
          ? '/workorder/downloadPhone'
          : '/workorder/downloadApproval'
      // /workorder/downloadPhone  电话单
      // /workorder/downloadApproval 审批单
      if (this.selectList.length > 0) {
        this.dList(this.selectList, url)
      } else {
        this.$confirm('是否下载全部查询结果', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          this.dList(
            this.workorderList.map((item) => item.id),
            url
          )
        })
      }
    },

3、dList 方法

将它写在了main.js中,调用的时候通过this.dList( )调用

  • process.env.VUE_APP_BASE_API + url + '?ids=' + ids --->这个打印出来是一个地址,点击下载的时候会跳转到拼接的这个地址然后下载
  • 拼接的地址中,传的参数是由后端决定的(例如:ids)
Vue.prototype.dList = function (ids, url) {
  if (ids.length === 0) {
    this.$message.error('请先选择需要下载的内容')
    return false
  }
  // this.$http.get(url + '?ids=' + ids).then(res => {
  // console.log(res);
  // }).catch(() => {
  // console.log('进入错误', e);
  window.open(process.env.VUE_APP_BASE_API + url + '?ids=' + ids)
  // })
}

下载时调用的接口时发送get请求,当时会产生跨域问题,所以选择用window.open( )方法

4、下载成功后(下载后的文件名字是后端来设置的)

二。new FileReader( )

 1、绑定点击事件

<div class="form-panel-title-desc-button">
    <div class="plain-button" @click="downLoad('phone')">
        <span class="plain-button-text">
            <i class="el-icon-printer"></i> 
            电话单
        </span>
    </div>
    <div class="plain-button" @click="downLoad('approval')">
        <span class="plain-button-text">
            <i class="el-icon-printer"></i> 
            审批单
        </span>
    </div>
</div>

2、method中的方法

downLoad (type) {
      this.$http
        .post(
          `/b/workorder/${type}/${this.downLoadId}`,
          {},
          { responseType: 'blob' }
        )
        .then((res) => {
          const reader = new FileReader() //  实例化 FileReader
          reader.readAsDataURL(res.data) // 将读取到的文件编码成DataURL
          reader.onload = (e) => {
            // 调用API onload  文件读取成功时触发
            // 模拟a标签点击
            let a = document.createElement('a') // 创建a标签,
            a.download = `${
              type === 'phone'
                ? '北京市市民热线服务中心电话登记单'
                : '北燃实业集团市政工单公开答复内容审批单'
            }-${this.workorderForm.workOrderNumber}.docx` // 设置格式
            // a.download = '北京市市民热线服务中心电话登记单-' + '.docx' // 设置格式
            a.href = e.target.result // 下载文件流链接
            document.body.appendChild(a) // 将标签DOM,放置页面
            a.click()
            document.body.removeChild(a) // 移除标签节点
          }
          reader.onerror = (e) => {
            this.$message({
              message: '解析文件发生错误',
              type: 'warning'
            })
          }
          reader.onabort = (e) => {
            this.$message({
              message: '解析文件发生意外终止',
              type: 'warning'
            })
          }
        })
    },

3、当点击下载时,返回一个文件流

 

;