前端大文件分片上传

这段代码展示了如何处理大文件上传,首先检查文件格式和大小,然后进行分片上传。文件被切割成5MB的块,每个块通过异步方式上传。上传过程中更新进度条,并在所有分片成功上传后合并文件。如果文件非法,会给出警告并移除文件项。
摘要由CSDN通过智能技术生成
/**
 * @description: 选择上传文件
 * @param file el-upload 返回的参数
 */
const handleFileUpload = async (index, i, type, item, file) => {
  // 如果文件合法,则进行分片上传
  if (await checkMirrorFile(item, file)) {
    // 文件信息
    const files = file.file;
    // 从 0 开始的切片
    const shardIndex = 0;
    item.progress = 0;
    // 调用 文件切片 方法
    uploadFileSilce(files, shardIndex, item);
    // 文件非法,则进行提示
  }
};
// 校验文件格式和大小函数函数
const checkMirrorFile = async (item, file) => {
  // 校验文件格式,支持.zip/.tar
  const fileType = file.file.name.split(".");
  if (item.ext.indexOf(fileType[fileType.length - 1]) == -1) {
    ElMessage.warning("文件格式错误");
    item._value.pop();
    return false;
  }
  // 校验文件大小
  const fileSize = file.file.size;
  // 文件大小是否超出 2G
  if (fileSize > item.size * 1024 * 1024) {
    ElMessage.warning("上传文件大小不能超过" + item.size + "M");
    item._value.pop();
    return false;
  }
  return true;
};
/**
 * @description: 分片函数
 * @param file 文件
 * @param shardIndex 分片数量
 */
const uploadFileSilce = (file, shardIndex, item) => {
  // 文件名
  const { name } = file;
  // 文件大小
  const { size } = file;
  // 分片大小 5M
  const shardSize = 1024 * 1024 * 5;
  // 分片总数
  const shardTotal = Math.ceil(size / shardSize);
  // 文件开始结束的位置
  const start = shardIndex * shardSize;
  const end = Math.min(start + shardSize, size);
  // 开始切割
  const packet = file.slice(start, end);

  // 拼接请求参数
  const formData = new FormData();
  formData.append("file", packet);
  formData.append("type", "file");
  formData.append("plan_uuid", data.plan_uuid);
  formData.append("name", name);
  formData.append("chunk", shardIndex + 1);
  formData.append("chunks", shardTotal);
  // 如果 当前分片索引 小于 总分片数
  if (shardIndex < shardTotal) {
    // 进度条保留两位小数展示
    item.progress = Number(((shardIndex / shardTotal) * 100).toFixed(2)) * 1;
    // 调用文件上传接口
    reqBlobUpload(formData)
      .then((res) => {
        if (res.status == 1) {
          ElMessage({
            type: "success",
            message: "上传成功",
          });
          item._value[item._value.length - 1].url = res.url;
          item._value[item._value.length - 1].path = res.path;
          item.value.push(res.path);
          item.progress = 0;
          return;
        }
        if (res.status == 0) {
          shardIndex++;
          // 递归调用 分片函数
          uploadFileSilce(file, shardIndex, item);
        }
      })
      .catch((err) => {
        item._value.pop();
      });
  }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值