vue实现大文件切片,点击上传

 <el-upload class="upload-demo" ref="upload" :file-list="fileList" :auto-upload="false" :limit="1" :on-change="handleChange">
    <el-button slot="trigger" size="small" type="primary">选取文件</el-button>
    <el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload">上传到服务器</el-button>
  </el-upload>
  
	data(){
	    return{
	      oneId:'',//编号
	      splitCount:'',//数目
	      chunkList:null,//全部切片文件
	      fileMd5:'',//唯一标识码
	    }
	  },
    handleChange(uploadFile) {
      // 文件信息
      let fileRaw = uploadFile.raw
      console.log(fileRaw)
      // 获取 文件的 MD5唯一标识码
      let fileMd5 = null
      try {
        fileMd5 = "111"
      } catch(e) {
        console.error('[error]', e)
      }
      if(!fileMd5) return
      // 每片的大小为 5M 可调整
      const chunkSize = 5 * 1024 * 1024
      // 文件分片储存
      let chunkList = []
      function chunkPush(page = 1) {
        chunkList.push(fileRaw.slice((page - 1) * chunkSize, page * chunkSize))
        if(page * chunkSize < fileRaw.size) {
          chunkPush(page + 1)
        }
      }
      chunkPush()
      this.chunkList = chunkList;
      this.fileMd5 = fileMd5;
      this.fileRawName = fileRaw.name;
    },

    submitUpload() {
      for(let i = 0; i < this.chunkList.length; i++) {
        let formData = new FormData()
        formData.append('orderNo', i) // 当前片段的索引
        formData.append('chunkSize', 5 * 1024 * 1024) // 切片的文件分片大小 (就是以多少字节进行分片的,这里是5M)
        formData.append('splitCount', this.chunkList.length) // 共有多少分片
        formData.append('file', this.chunkList[i]) // 当前分片的文件流
        formData.append('fileNo', this.fileMd5) // 整个文件的唯一标识码,不是分片
        formData.append('fileName', this.fileRawName) // 文件的名称
        formData.append('split', 1) // 是否分片,1是,0否
        formData.append('size', this.chunkList[i].size) // 当前切片的大小
        console.log(i,this.chunkList.length,this.chunkList[i], this.fileMd5,this.fileRawName,this.chunkList[i].size);
        axios.post('上传接口',formData).then((res)=>{
          console.log('成功',res);   //  处理成功的函数 相当于success 
        }).catch((error)=>{
          console.log('失败',error)  //  错误处理 相当于error
        })
      }
    },
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值