大文件上传解决方案

一、业务场景:

ai课堂需求,涉及到视频的播放,需要在后台上传视频,视频的最大限制是500MB,当视频较大的时候,普通的上传会有问题,导致上传失败。这就要求我们将大文件进行拆分,分片进行上传,在所有分片上传成功之后,再进行合并。

二、前后端交互流程:

1、前端调用后端分片文件上传初始化接口

2、在初始化接口调用后,后端给前端返回分片上传的地址,分片数量是几个,后端就会给前端返回几个地址。前端去调用这些地址(前端直连minio),进行分片上传。

3、待所有分片都上传完毕后,调用合并接口进行文件的合并。

最终得到完整的视频播放地址。

三、核心代码

javascript 复制代码
/分片上传
    axiosPartUpload(file) {
      //分片大小
      const chunkSize = 10 * 1024 * 1024;

      const fileSize = file.size

      //计算当前选择文件需要的分片数量
      const chunkCount = Math.ceil(fileSize / chunkSize)
      this.totalCount=chunkCount;
      
      let initParams={
        fileName:file.name,
        fileSize:fileSize,
        partCount:chunkCount,
        contentType:file.type
      }
      this.isUploading=true;
      //调用初始化接口
      initUpload(initParams).then(async res=>{
        console.log(res,'初始化接口返回结果')
        this.uploadId=res.uploadId;
        this.objectName=res.objectName;
        let urlList=res.urlList;
        for(let i=0;i<urlList.length;i++){
          //文件截取
          let start = i * chunkSize;
          let end = Math.min(fileSize, start + chunkSize);
          let chunkFile = file.slice(start, end);

          //调用分片上传接口
          await uploadPart(urlList[i],chunkFile).then(res2=>{    
            console.log(`第${i+1}个分片上传成功`)
            this.successCount=i+1;
          }).catch(err=>{
            this.isUploading=false;
            this.$message.error(`第${i+1}个分片上传失败`)
          })
        }

        //所有分片上传完成之后,进行合并
        let mergeParams={
          uploadId:this.uploadId,
          objectName:this.objectName
        }
        mergeFile(mergeParams).then(res2=>{
          console.log(res2,'合并接口返回结果')
          this.$emit("getVideoUrl", res2.fileUrl, file.name);
          this.$message({
              message: "上传成功",
              type: "success"
            });
            this.isUploading=false;
        })
      }).catch(err=>{
        this.isUploading=false;
        this.$message({
          message: "上传失败,请重新选择文件上传!",
          type: "error"
        })
      })
    },

四、存在问题

1、缺少断点续传逻辑。

2、分片串行上传,上一分片上传结束后上传下一分片,效率不高。

相关推荐
sg_knight3 天前
如何实现“秒传”与“断点续传”?MinIO + Java 实战进阶篇
java·开发语言·文件管理·minio·ftp·oss·文件传输
分布式存储与RustFS4 天前
AI 数据湖最佳实践:RustFS 支撑大模型训练的存储架构与性能优化
人工智能·性能优化·架构·对象存储·minio·企业存储·rustfs
分布式存储与RustFS8 天前
Windows原生版RustFS:无需Docker,1分钟本地对象存储环境搭建
windows·docker·容器·对象存储·minio·企业存储·rustfs
阿杜杜不是阿木木8 天前
authentik开源身份认证与管理平台-与 MinIO 集成(8)
minio·authentik
sg_knight11 天前
Docker环境下的MinIO安装,以及如何正确配置数据持久化(避坑篇)
运维·docker·容器·minio·ftp·cos·oss
sg_knight11 天前
MinIO自带的Web Console管理后台怎么用?日常管理操作全解
前端·文件管理·minio·ftp·cos·oss
分布式存储与RustFS12 天前
RustFS永久开源承诺深度解读:Apache 2.0协议、商业化边界、社区可信度
开源·apache·数据安全·对象存储·minio·企业存储·rustfs
sg_knight12 天前
CentOS 裸机实操:5分钟完成 MinIO 单机部署与公网访问
linux·python·centos·文件管理·minio·ftp·oss
伟大的大威18 天前
彻底解决 Nginx Proxy Manager 反代 MinIO 报 SignatureDoesNotMatch (S3 签名不匹配) 的终极方案
运维·nginx·minio
是萝卜干呀22 天前
Minio 模拟S3云存储
minio·s3·模拟云存储