带进度条的上传功能

html部分主要包含一个上传按钮和一个展示进度条的小框

<template>
  <div>
    <el-upload
      class="upload-demo"
      style="float: left"
      action
      :before-upload="beforeAvatarUpload"
      :on-change="getFile"
      :auto-upload="false"
      :show-file-list="showFileList"
    >
      <el-button size="mini" :disabled="loading" icon="el-icon-upload2" type="primary">上传</el-button>
    </el-upload>
    <div v-if="loading" class="box">
      <div class="content">
        正在上传:
        {{ fileOriginName }}
        <!-- 被上传的文件名称 -->
      </div>
      <el-progress :text-inside="true" :stroke-width="14" :percentage="uploadPercent"></el-progress>
    </div>
  </div>
</template>
<style lang="less" scoped>
.box {
  position: absolute;
  bottom: 20px;
  right: 20px;
  height: 50px;
  width: 350px;
  border: 1px solid #ccc;
  padding: 20px;
}
.content {
  padding-bottom: 10px;
  width: 80%;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
</style>

下面是方法部分,

1.封装接口参数,format格式

2.处理请求头,项目中一般要求带token信息等

3.由于要掉要处理进度的方法,不能使用统一封装的接口请求,直接使用axios进行处理
 axios.post(url,params,headers(fuction)).then().catch()
下面是代码演示
 

  methods: {
    getFile(file) {
      //封装接口参数,采用format格式
      var formdata = new FormData()
      formdata.append('files', file.raw)
      this.rowList.fileCode ? formdata.append('fileCode', this.rowList.fileCode) : ''

      this.fileOriginName = file.name
      //处理请求头,接口要求
      const service = axios.create({
        headers: {
          Authorization: 'Bearer ' + localStorage.getItem('accessToken'),
          tenantName: localStorage.getItem('tenantName')
        }
      })
      // this.getAxiosMultiPostConfig方法占据了headers的填充位置,所以提前处理axios的headers部分
      // 可以根据接口需求在service里进行配置请求头内容
      service
        .post(
          '/api1/oss/upload', //(url)
          formdata, //参数(params)
          this.getAxiosMultiPostConfig((val) => {
            this.loading = true
            this.uploadPercent = val //将处理进度百分比赋值给el-process进度条
          }) //处理进度的方法
        )
        .then(() => {
          this.uploadPercent = 100 //处理完毕后手动赋值进度条100%
          this.loading = false
          this.searchList() //查询
        })
        .catch((error) => {
          this.uploadPercent = 0
          this.loading = false
          this.$message.error('接口出错!!!')
          this.searchList()
        })
    },
    //处理进度条的回调函数
    getAxiosMultiPostConfig(callBack) {
      // 上传进度回调
      function onUploadProgress(progressEvent) {
        if (progressEvent.lengthComputable) {
          let val = (progressEvent.loaded / progressEvent.total) * 100
          val = parseInt(val)
          // 这里的进度只能表明文件已经上传到后台,但是后台有没有处理完还不知道
          // 因此不能直接显示为100%,不然用户会误以为已经上传完毕,关掉浏览器的话就可能导致上传失败
          // 等响应回来时,再将进度设为100%
          if (val < 100) callBack(val)
        }
      }
      let config = {
        headers: {
          'Content-Type': 'multipart/form-data',
          tenantName: localStorage.getItem('tenantName')
        },
        onUploadProgress: onUploadProgress
      }
      return config
    }
  }

 效果演示图

 

备注:对于大文件会有进度条显示进度,小文件上传,速度太快不会有进度的显示 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值