zoukankan      html  css  js  c++  java
  • 大文件前端简单分段上传

    使用vue和element-ui el-upload

    <el-upload action="#" :http-request='splitFile'></el-upload>
    
    fileNum:1;
    methods:{
      splitFile(file){
        const reader=new FileReader();
        reader.readAsArrayBuffer(file);
        let fileName=file.name;
        const blockSize=4*1024*1024;
        reader.addEventListener('load', async (e)=>{
          let nextSize=Math.min(this.fileNum*blockSize,file.size);
          if(file.size==nextSize){
            const percent=nextSize/file.size;
            const slice=e.target.result;
            try{ await this.uploadFile(slice,percent,fileName); }catch(err){ await this.uploadFile(slice,percent,fileName);  }//上传错误,重新上传          
          }
          while(file.size>nextSize){ 
            nextSize=Math.min(this.fileNum*blockSize,file.size);
            const percent=(blockSize*this.fileNum)/file.size;
            const slice=e.target.result.slice((this.fileNum-1)*blockSize,nextSize);
            try{ await this.uploadFile(slice,percent,fileName); }catch(err){ await this.uploadFile(slice,percent,fileName);  }//上传错误,重新上传 
            this.fileNum++;
          }
        });
      },
      uploadFile(slice,percent,fileName){
        let sliceOrder=this.fileNum-1;//上传的文件片段从0开始
        let fName=fileName.split(',');
        let sliceName=fname[0]+sliceOrder+'.'+fname[1];
        let sfile=new File([slice],sliceName);//文件片段转为 file类型
        const form=new formData();
        form.append('file',sfile);
        form.append('sliceOrder',sliceOrder);
        form.append('fileName',fileName);
         return uploadFile(form)
      }
    }

    总结:

    1 readAsArrayBuffer 得到的数据是arrayBuffer类型的,需要转为file    new File([file],fileName)

    2 上传的代码片段如果太大,会出现  failed to load response data,看不到请求体和返回数据,本人测试谷歌浏览器设置为5M不行,设置为4M就可以正常显示了(blockSize)

  • 相关阅读:
    BZOJ 1036 树的统计 | 树链剖分模板题
    BZOJ 3295 动态逆序对 | CDQ分治
    Luogu 3810 & BZOJ 3262 陌上花开/三维偏序 | CDQ分治
    BZOJ 2152 聪聪可可 | 树的点分治
    BZOJ 2458 最小三角形 | 平面分治
    51nod 1564 区间的价值 | 分治 尺取法
    Luogu 1429 平面最近点对 | 平面分治
    Codeforces 633C Spy Syndrome 2 | Trie树裸题
    一棵简单能用的左偏树
    【网络流24题】餐巾计划(图解)
  • 原文地址:https://www.cnblogs.com/xiaofenguo/p/15673016.html
Copyright © 2011-2022 走看看