上传及下载文件时获取进度值并展示(超时时间单独设置)

本文介绍了如何在Vue应用中监听文件上传和下载的进度,并实时更新到界面上。通过axios的onUploadProgress和onDownloadProgress方法,结合EventBus实现进度更新。同时展示了如何设置接口超时时间和处理文件流返回的问题。
摘要由CSDN通过智能技术生成

最近做了这样一个界面需求,需要监听下载文件时的进度
在这里插入图片描述

在这里插入图片描述

在接口请求工具类中的代码如下:
文件上传及下载(onUploadProgress方法是关键)

/****
   * 文件上传,data => new FormData()方式传参
   * @param url
   * @param data
   * @returns {*}
   */
  uploadFilePost (url, data = {}, time = 10000) {
  return service({
      url: url,
      method: 'post',
      headers: {
       'Content-Type': 'multipart/form-data'
      },
      data: data,
       timeout: time
       // 关键代码
       onUploadProgress: function (progressEvent) {
       let complete = (progressEvent.loaded / progressEvent.total * 100 | 0) + '%
       // 发送进度
       EventBus.$emit('noticeProgress', complete)
       }
    })
  },
   /****
   * 文件下载
   * @param url
   * @param params
   * @returns {Promise<unknown>}
   */
  downloadFile (url, params = {}) {
    return new Promise((resolve, reject) => {
      service.get(url, {
        params: params,
        timeout: 300 * 1000,//数据量大时下载接口请求时间需长一些,单独配置
        responseType: 'blob',
        // 关键代码
        onDownloadProgress: function (progressEvent) {
        const total = params.total ? params.total : progressEvent.total
          if (Object.keys(params).length && total) {
            let complete = (progressEvent.loaded / total * 100 | 0)
            // 发送进度
            EventBus.$emit('noticeDownload', complete)
          }
         }
      }).then(response => {
        resolve(response)
      }).catch(error => {
        reject(error)
      })
    })
  }

那么在发起文件请求时(此处以下载为例),progressValue是渲染到界面的进度值,代码如下:

  mounted () {
    EventBus.$on('noticeDownload', (res) => {
    // progressValue 就是渲染到界面的进度值
      this.progressValue = res
      if (res === 100) {
      	this.finished = true
      }
    })
   }

以上就是获取上传及下载进度并渲染到界面的代码。

另外补充一点,如果需要单独设置某个接口的超时时间(比如有时候某个接口的超时时间需要长一些),可以这样写:
默认的超时时间为10000毫秒(10秒)

//默认的超时时间为10000毫秒(10秒)
  get (url, params = {}, time = 10000) {
    return new Promise(((resolve, reject) => {
      service.get(url, { params: params,timeout: time, }).then(response => {
        resolve(response)
      }).catch(error => {
        reject(error)
      })
     }))
  }

调用:
此时这个接口的请求时间为30s

// 此时这个接口的请求时间为30s
this.$httpService.get(getInfo + `${sn}`, params, 30000).then(res => {}

备注:
如果出现文件流返回了,但是打印返回的res是undefined,需要去查看响应拦截器,数据请求回来后,在被.then或.catch处理之前,会在这里拦截一下数据再return出去

axios.interceptors.request.use((response)=>{},(error)=>{}

在这里插入图片描述
在这里插入图片描述
这里有两个文章可以更深入了解:
http://t.zoukankan.com/ishoulgodo-p-13593762.html
https://www.jianshu.com/p/14d98be69177

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值