vue中文件上传阿里云并获取上传进度

因为要上传手机版的安装包,上传的文件过大,为了保证良好的用户体验所以需要获取上传进度。结合了element_UI的进度条和上传组件完成了上传的动作。

html代码
     <el-upload
                  action="上传路径"
                  list-type="text"
                  :file-list="fileList"
                  :before-upload="beforeAvatarUpload"
                  :http-request="Upload"
                  :show-file-list="false"
                            >
                  <div class="btn_upload">上传安装包</div>
              </el-upload>
              <el-progress v-show="showProgress" :text-inside="true" :stroke-width="15" :percentage="uploadPercent"></el-progress>
           // el-upload提供了http-request方法覆盖组件默认上传事件,before-upload上传前钩子函数用来筛选文件类型return false则会阻止上传


data中return出的数据
      xhr: new XMLHttpRequest(),
      //声明一个全局的ajax对象是为了调用关闭上传事件函数
      showProgress: false,
      //控制进度条显示隐藏
beforeAvatarUpload(file) {
      let name = file.name
      var apk = name.substring(name.length-3,name.length)
      字符串截取为了兼容火狐,火狐浏览器获取apk文件的type为空
      const isAPK = apk === "apk";
      if (!isAPK) {
        this.$message.error("上传只能是 apk 格式安装包!");
      }
      return isAPK;
    },
Upload(file) {
      // 先要获取后端签名
      let pro = new Promise((resolve, rej) => {
        var res = JSON.parse(Cookies.get("sign"));
        var timestamp = Date.parse(new Date()) / 1000;
        if (res.expire - 3 > timestamp) {
          resolve(res);
        } else {
          this.$http.get("/apiservice/oss/getSign").then(res => {
            Cookies.set("sign", JSON.stringify(res.data));
            resolve(res.data);
          });
        }
      });
      pro.then(success => {
        var data = success;
        var ossData = new FormData();
        var date = new Date();
        var s = date.getTime();
        var y = date.getFullYear();
        var m = date.getMonth() + 1;
        var d = date.getDate();
        ossData.append("name", file.file.name);
        ossData.append(
          "key",
          data.dir + "/" + y + "/" + m + "/" + d + "/" + s + ".apk"
        );
        ossData.append("policy", data.policy);
        ossData.append("OSSAccessKeyId", data.accessid);
        ossData.append("success_action_status", 201);
        ossData.append("signature", data.signature);
        ossData.append("file", file.file, file.file.name);
        this.xhr.open("post", data.host, true);          
        this.xhr.upload.addEventListener(
          "progress",
          this.progressFunction,
          false
        ); //调用方法监听上传进度
        this.xhr.onload = () => {
          this.$message({
            type: "success",
            message: "上传完成"
          });
        };
        this.xhr.send(ossData);
      });
    },
    progressFunction(event) {
      // 设置进度显示
      if (event.lengthComputable) {
        var percent = Math.floor(event.loaded / event.total * 100);
        if (percent > 100) {
          percent = 100;
        }
        this.uploadPercent = percent;
      }
      this.showProgress = true;
    },
    refUpload() {
      //关闭上传事件
      this.xhr.abort();
    },




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值