大文件上传和优化

简介: 最近项目里面有一些视频处理的功能,大概流程就是后端拿到文件以后,使用FFmpeg等底层命令进行去水印,裁切等功能,虽然现在是短视频的年代,但是依然会出现一些高分辨率,高时长的大文件视频,这时候因为一些原因,如网络等,失败率会陡增。

上传文件往往需要走这么几个步骤:
1.判断类型
2.判断大小
3.拿到上传地址
4.往地址推送文件

当文件符合要求,且比较小的时候,成功率是比较高的,但如果文件大,上传的路径又复杂,再加上网络问题,失败率就会陡增,这时候该怎么改善体验呢?
很典型的一个场景,迅雷、百度云盘,这些都是允许用户主动暂停,或者允许进行一半失败了接着进行。

即使不是这样的场景,我们也希望达到两个目的:

一、大文件不因中途出了一点点问题就彻底失败。

二、上传过程可以获知当前进度,让用户知道传了多少,还要等待多久。

所以,提高上传成功率,让用户对较长的上传过程有所感知,就是我们优化的目标。

1. 第一步:文件分片

通常情况下,file文件来源于Input元素选择文件后返回的FileList对象,或者自由拖放操作生成的DataTransfer对象。

File的本身是没有slice的方法的,不过它从Blob的接口继承了该方法。

接下来,我们进行切割文件

  file.slice(0,2*1024*1024)

这是将文件从开头切割到2M大小的地方,然后我们只需要确定分片的文件阈值,例如50MB的文件就开始进行分片,然后每一片的大小,这里需要进行一个取舍,在片数较少的情况下,保证单片的传输效率

第二步:分片上传

  let index = 0,// 记录当前已经切割的分片大小
    fileList= [];  // 请求参数列表
while (index < file.size) {
   
    // 这里向参数列表添加参数项,具体可由前后端协定
    fileList.push({
    filename: index / SIZE, fileChunk: file.slice(index, index + SIZE), 'content-length': file.size % SIZE });
    index += SIZE;
}

在这里构造好自己的参数类型后,向后端发起请求。
如果后端支持并发,那就直接发请求,如果不行,就用async/await,配合Promise.all()来一片片的阻塞上传

第三步:容错处理

1.用户手动取消的场景
2.断点续传的场景,例如网页刷新,网络异常等,这个时候,根据记录的分片索引,重新开始上传文件,这样就不需要用户从头开始上传,大大优化用户体验。
3.失败重试的场景,因为每一片文件都是一次请求,难免因为网络情况会导致部分切片失败,这里根据是阻塞上传还是并发上传进行一点区别处理。如果多次失败,就给用户进行提示,因为多次上传失败,要么是因为这个ip的请求间隔过短,被服务器锁了请求,或者服务器崩了,亦或者用户网络不行,这个时候就把选择权让渡给用户本身即可。

写在最后

如果是单个固定请求的重试,不必传参数,写到封装的方法中即可,但分片上传时每次的参数都不同,就需要传入参数。

重试的是一个新的请求,不是上次请求的结果,所以需要封装为一个函数,每次调用重新发起,而不是将上次请求的结果再次传入。

相关文章
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
1442 10
|
关系型数据库 MySQL 数据库
MySQL开启远程访问权限
默认情况下,mysql只允许本地登录,但是多数情况下,我们需要访问服务器上的数据库资源,此时就需要开放MySQL的远程访问权限。 本文主要讲解如何开启MySQL的远程访问权限。
38392 7
MySQL开启远程访问权限
|
10月前
|
存储 编解码 缓存
上传文件卡顿?阿里云点播上传加速技巧全解析
本文系统解析阿里云视频点播上传机制,针对进度停滞、超时失败等问题,分享选型策略、分片上传、并发优化等实战技巧,助力提升上传效率与稳定性。
|
10月前
|
人工智能 安全 数据可视化
面向业务落地的AI产品评测体系设计与平台实现
在AI技术驱动下,淘宝闪购推进AI应用落地,覆盖数字人、数据分析、多模态创作与搜推AI化四大场景。面对研发模式变革与Agent链路复杂性,构建“评什么、怎么评、如何度量”的评测体系,打造端到端质量保障平台,并规划多模态评测、可视化标注与插件市场,支撑业务持续创新。
1635 38
|
8月前
|
人工智能 自然语言处理 API
2026年OpenClaw快速部署+200个实用OpenClaw Skills解锁+生态深度解析
OpenClaw(原名Clawdbot/Moltbot)作为开源Agent框架的标杆,彻底颠覆了AI的使用逻辑——它不再是单纯的对话工具,而是能调用本地工具、系统程序、第三方服务的“全能执行者”。而Skills(技能插件)正是其核心竞争力所在,如同为AI配备了“超级外挂”,让OpenClaw能完成实时数据查询、PPT生成、邮件管理、代码开发等复杂任务。
1880 5
|
10月前
|
人工智能 前端开发 Unix
从CLI原理出发,如何做好AI Coding
本文探讨CLI类AI编程工具的产品美学与技术原理,分析其遵循Unix哲学的轻量、可组合、可集成特性,解析Single Agent架构与上下文工程的实践,并分享如何通过Prompt优化、任务拆解与团队对齐,高效利用CLI提升编码效率,展望AI时代人机协作的新范式。
1476 10
从CLI原理出发,如何做好AI Coding
|
机器学习/深度学习 资源调度 计算机视觉
RT-DETR改进入门篇 | 手把手讲解改进模块如何实现高效涨点,以SimAM注意力模块为例
RT-DETR改进入门篇 | 手把手讲解改进模块如何实现高效涨点,以SimAM注意力模块为例
825 2
RT-DETR改进入门篇 | 手把手讲解改进模块如何实现高效涨点,以SimAM注意力模块为例
|
12月前
|
人工智能 搜索推荐 数据可视化
当AI学会“使用工具”:智能体(Agent)如何重塑人机交互
当AI学会“使用工具”:智能体(Agent)如何重塑人机交互
1016 115
|
7月前
|
人工智能 Shell 开发工具
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(5)Skills (技能加载)
本文介绍AI Agent的技能加载机制,解决系统提示词臃肿问题。通过两层设计:系统提示只保留技能名称(低成本),需要时通过tool_result按需加载完整内容。SkillLoader扫描skills目录下的SKILL.md文件,解析YAML元数据,实现渐进式知识披露,大幅节省token消耗。
2351 1