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)

  • 相关阅读:
    条形码校验码生成
    js 模仿块级作用域(私有作用域)、私有变量
    js 闭包
    js 继承
    javascript 创建对象
    jQuery.noConflict() 函数
    C#对话框-打开和保存对话框(转)
    String.format()的用法
    转:WPF中ListBox的创建和多种绑定用法
    在wpf或winform关闭子窗口或对子窗口进行某个操作后刷新父窗口
  • 原文地址:https://www.cnblogs.com/xiaofenguo/p/15673016.html
Copyright © 2011-2022 走看看