前端上传一个大文件,分成小份处理,一份份传给后端

import api from '@/api';

//切割大文件
function cutFile(file, cutSize) {
	//分成多少份
  let count = (file.size / cutSize) | 0,
    fileArr = [];
  for (let i = 0; i < count; i++) {
    fileArr.push({
      name: file.name + '.part' + (i + 1),
      file: file.slice(cutSize * i, cutSize * (i + 1))
    });
  }
  fileArr.push({
    name: file.name + '.part' + (count + 1),
    file: file.slice(cutSize * count, file.size)
  });
  return fileArr;
}

export function upload_big(file, cutSize, folderPath, ftpProvince) {
  //判断上传文件是否超过需要切割的大小
  if (file.size > cutSize) {
    let fileArr = cutFile(file, cutSize); //切割文件
    cutFile_upload(fileArr);
  } else {
    let formData = new FormData();
    formData.append('isLast', 'true');
    formData.append('file', file);
    api.uploadFile(formData).then((res) => {
      console.log(res);
    });
    return;
  }
  /*
   * 切割文件上传,配合后台接口进行对接
   * 传输参数:
   * count   -- 当前传输part的次数
   * name    -- 做过处理的文件名称
   * file    -- 上传的.part的切割文件
   * isLast  -- 是否为最后一次切割文件上传(默认值:"true"  字符串,只有最后一次才附加/不用分割直接上传)
   * */
  function cutFile_upload(fileArr, count) {
    let formData = new FormData();
    if (count == undefined) {
      count = 0;
      formData.append('count', count);
      formData.append('name', fileArr[0].name);
      formData.append('file', fileArr[0].file);
    } else {
      if (count === fileArr.length - 1) {
        formData.append('isLast', 'true');
      }
      formData.append('count', count);
      formData.append('name', fileArr[count].name);
      formData.append('file', fileArr[count].file);
    }
    api.uploadFile(formData).then((res) => {
      let currCount = Number(res.data);
      if (currCount) {
        if (currCount != fileArr.length) {
          cutFile_upload(fileArr, currCount);
        }
      }
    });
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值