首页 > 其他分享 >vue实现大文件分片上传

vue实现大文件分片上传

时间:2023-12-08 18:33:50浏览次数:26  
标签:1024 vue const 文件 e4% blob 分片 上传

这里使用了element ui的文件上传插件

      <div class="inputTitle">人员资料</div>
      <div class="uploadBox">
        <div class="picture">
          <img src="@/assets/images/zip-before.png">
        </div>
        <el-upload :show-file-list="false" accept=".zip" :limit="1" action class="mirror-upload" :http-request="putinMirror" :auto-upload="false" ref="upload">
          <el-button type="primary">上传人员资料</el-button>
        </el-upload>
        <div class="fileType">仅支持zip压缩包文件</div>
      </div>
      <div style="width:75%;margin: 20px auto;">
        <el-progress :percentage="progress" :indeterminate="true" />
      </div>
      <div class="dialog-footer" v-if="showbtn">
        <el-button type="primary" @click="commitFile">确定</el-button>
        <el-button @click="closeInput">取消</el-button>
      </div> 

定义全局的字段

  data () {
    return {
      showbtn:true,
      progress:0,//进度条
    }
  },

js代码部分

commitFile(){
      this.$refs.upload.submit();
    },
    closeInput(){
      this.progress = 0;
      this.importDialog = false;
    },
    async putinMirror(file){
      // 每个文件切片大小定为5MB
      var sliceSize = 0.5 * 1024 * 1024;
      //文件大小限制为最大1个G,可根据需求修改
      var filesizes  = 1 * 1024 * 1024 * 1024;
      let that = this;
      const blob = file.file;
      const fileSize = blob.size;// 文件大小
      const fileName = blob.name;// 文件名
      //计算文件切片总数
      const totalSlice = Math.ceil(fileSize / sliceSize);
      if(fileSize <= filesizes){
        that.showbtn = false;
        // 循环上传
        for (let i = 0; i < totalSlice; i++) {
            let start = i * sliceSize;
            let chunk = blob.slice(start, Math.min(fileSize, start + sliceSize));
            const formData = new FormData();
            formData.append("file", chunk);
            formData.append("signal", blob.uid);
            formData.append("name", fileName);
            formData.append("size", fileSize);
            formData.append("chunks", totalSlice);
            formData.append("chunk", i+1);
            let res = await uploadExcleAndZip(2,formData);//一个分片上传完成后再调用接口上传下一片
            console.log(res);
            if(res.errCode == 0){
              this.progress = ((i+1)/totalSlice).toFixed(1) * 100;//控制进度条
              setTimeout(function() {
                if((i+1) == totalSlice){
                    that.$message({
                      message: '上传成功',
                      type: 'success'
                    });
                    that.showbtn = true;
                    that.closeInput();
                    that.getTreeData();
                  }
              }, 1000);
            }else {
              that.$message({
                message: '上传失败',
                type: 'error'
              });
            }
        }
      }else{
        that.showbtn = true;
        that.$message({
          message: '文件大小超出1G',
          type: 'error'
        });
      }
    },
   

参考文章:http://blog.ncmem.com/wordpress/2023/12/08/vue%e5%ae%9e%e7%8e%b0%e5%a4%a7%e6%96%87%e4%bb%b6%e5%88%86%e7%89%87%e4%b8%8a%e4%bc%a0/

欢迎入群一起讨论

 

 

标签:1024,vue,const,文件,e4%,blob,分片,上传
From: https://www.cnblogs.com/songsu/p/17888811.html

相关文章

  • Vue2 的 diff 算法详解
    所谓diff算法,就是通过比对新旧两个虚拟节点不一样的地方,针对那些不一样的地方进行新增或更新或删除操作。接下来详细介绍节点更新的过程。首先进行静态节点处理,判断新旧两个虚拟节点是否是静态节点,如果是,就不需要进行更新操作,可以直接跳过更新比对的过程。再更新处理新老节点......
  • Vue3 diff算法详解
    Diff更新算法由于目前Vue3对于性能的优化做了很多的处理,所以其在更新时并不会对所有的节点都进行diff更新。目前会进行diff更新的有以下两种情况:v-for容器节点自写的render()函数还有一种特殊情况会进行无diff的按序更新,这种更新是全替换模式,非常耗时:无key值的v-for语句,......
  • vue+spirngboot前后端数据加解密(基于AES+RSA实现)
    案例说明案例只针对post请求这里使用’Content-Type’:‘application/x-www-form-urlencoded;charset=UTF-8’;为键值对的形式(非json)AES加密数据,RAS加密AES的key实现思路前台首先请求非加密接口获取后台的公钥前台在请求前生成自己的公钥和私钥,以及AES对称加密的key使用前台......
  • vue实现全局消息提醒功能(vue-extend)
    1.需求背景(1)在一般的管理系统或者H5应用中,需要交互反馈提醒。这种交互反馈,往往需要在多个组件中使用到,那么是否可以将其抽离出来,封装一个组件呢?答案是肯定的,可以根据日常的业务,对消息提醒功能进行封装,那么问题来了,如何实现一次注册,多次使用呢,关键时刻,vue.extendAPI就派上用场......
  • Vue之this.$options.data()和this.$data
    Vue之this.$options.data()和this.$data:https://blog.csdn.net/weixin_44090040/article/details/129875428?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_utm_term~default-1-129875428-blog-132714630.235^v39^pc_relevant_3m_sort_dl_base2&spm......
  • 在vue3中使用openlayers3实现track轨迹动画
    网上太多资料代码,抄来抄去,而且版本也是OL2的,部分API已经弃用基础知识不多说,直接讲重点三个关键变量//记录开始动画的时间conststartTime=ref(0);//轨迹分割的颗粒度,数值越小分的越细constparticle=20;//轨迹动画的速度,数值越大位移越快constspeed=10;根......
  • vue实现大文件分片上传 vue-simple-uploader
    首先为什么要分片上传?大部分小白使用element-ui中上传组件,但是直接用它上传大文件会超时或者RequestEntityTooLarge(请求实体太大)这种问题。1.使用插件vue-simple-uploader我的这个可以自定义样式(没懂的留言给我)1.1customUploader封装组件上代码:<template><divid="......
  • vue2、vue3适配大屏。分辨率变化,样式不变
    一、vue3适配大屏的,创建一个叫useDraw.jsexportdefaultfunction(){constscale={width:'1',height:'1',}constbaseWidth=1920constbaseHeight=1080constbaseProportion=parseFloat((baseWidth/baseHeight).toFixed(5......
  • vue3组件通信
    子传父$emit在vue框架中事件分为两种:一种是原生的DOM事件,另外一种自定义事件。原生DOM事件可以让用户与网页进行交互,比如click、change、mouseenter、mouseleave...自定义事件可以实现子组件给父组件传递数据。vue2中的@click绑定的是自定义事件,可以通过.native修饰符变为原生DOM......
  • Vue路由params、query传参用法,以及form表单回车自动提交问题
    一、路由参数用法1.1query参数第一种方式传参:跳转路由并携带query参数,注意to的字符串写法将id和title拼接字符串形成地址<router-link:to="`/home/message/detail?id=${item.id}&title=${item.title}`">{{item.title}}</router-link>&nbsp;&nbsp;第二种方式传参:to......