当前位置: 首页 > news >正文

前端大文件上传

1. 开场概述

  1. “大文件上传是前端开发中常见的需求,但由于文件体积较大,直接上传可能会遇到网络不稳定、服务器限制等问题。因此,通常需要采用分片上传、断点续传、并发控制等技术来优化上传体验”

2. 核心实现方案

“我通常会采用以下方案来实现大文件上传:

文件分片:将大文件切割成固定大小的块(例如 1MB 或 5MB),通过 Blob.slice() 方法实现。

分片上传:通过 FormData 将每个分片上传到服务器,使用axios发送请求。

秒传原理:在上传文件之前先询问这个文件服务器端是否已存在,

· 若已存在,则不需要上传了,直接让前端显示“已上传成功!

断点续传:
服务器记录已上传的分片,前端在上传前先查询已上传的分片列表,跳过已上传的部分。

并发控制:通过限制同时上传的分片数量,避免占用过多网络资源。

进度监控:
方案一“利用 axios的 onUploadPrigress可以实现接口请求进度
遇到问题:onUploadPrigress返回的进度只是文件切片
从前端上传到服务器这一过程的进度而已,
并不代表上传到服务器就绝对上传成功了!
后端报错造成上传失败,这样计算的进度条也是100%,所以文件完全上传到了服务器 !== 上传成功
解决方法:
与后端协商,得到切片并处理完后在返回值通知前端该切片以及上传成功
(上传成功的切片数 / 该文件的总切片数) * 100 去计算单个文件的上传进度条

业务需求:

在金融公司的贷前系统中,
用户需上传大量申请材料(如身份证、银行流水、合同扫描件等),
单个文件可能超过 1GB
且需支持多文件并发上传、断点续传这些要求。

技术方案与实现

分片上传与断点续传

实现逻辑:

前端分片:使用 Blob.slice() 将文件切割为 5MB 的块,

并为每个分片生成唯一 hash(基于文件名+分片序号+文件大小),

避免重复上传。

上传前校验:

调用服务端接口查询已上传分片列表,仅上传缺失分片。

并发控制:

限制同时上传的分片数为 3,避免浏览器线程阻塞。

断点续传(网络中断、超时、不小心刷新了页面等等,会导致上传中断)

断点续传的核心是记录已上传的文件分片信息,

当上传中断后,再次上传时跳过已成功上传的部分,

仅上传剩余分片。实现需前后端协作

实现的步骤

  1. 文件分片
  2. 生成分片唯一标识
    方案1:文件名 + 分片序号 + 文件大小(简单但可能有冲突)
    方案2:计算文件内容哈希(推荐,如MD5/SHA-256)
  3. 查询已上传分片
    上传前,前端向服务端发送文件唯一标识(如哈希),获取已上传分片列表
  4. 上传缺失分片
    仅上传未在服务端记录的分片。

断点续传的核心在于分片管理与状态持久化,需注意:

分片标识的唯一性
服务端分片信息的可靠存储
客户端与服务端的状态同步
最终文件完整性校验

通过合理的分片策略和错误处理机制,可显著提升大文件上传的健壮性和用户体验。

http://www.lryc.cn/news/540895.html

相关文章:

  • JDK源码系列(一)Object
  • 【Python 打造高效文件分类工具】
  • 大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(1)
  • 边缘安全加速(Edge Security Acceleration)
  • C/C++高性能Web开发框架全解析:2025技术选型指南
  • fedora 安装 ffmpeg 过程记录
  • 【GPU驱动】OpenGLES图形管线渲染机制
  • Spring Boot项目@Cacheable注解的使用
  • mac开发环境配置笔记
  • 重装CentOS YUM
  • 对免认证服务提供apikey验证
  • 数据库驱动免费下载(Oracle、Mysql、达梦、Postgresql)
  • OceanBase 初探学习历程之——安装部署
  • Windows 下免费开源的多格式文件差异对比工具
  • Vue3+element UI:使用el-dialog时,对话框不出现解决方案
  • postman调用ollama的api
  • PyTorch的dataloader制作自定义数据集
  • 如何调用 DeepSeek API:详细教程与示例
  • Hadoop-HA集群部署
  • 三、linux字符驱动详解
  • 【Research Proposal】基于提示词方法的智能体工具调用研究——研究问题
  • 【从0做项目】Java文档搜索引擎(9)烧脑终章!
  • python: SQLAlchemy (ORM) Simple example using mysql in Ubuntu 24.04
  • 如何为自己的 PDF 文件添加密码?在线加密 PDF 文件其实更简单
  • echarts 折线图动态基准线设置超出基准线标红
  • Part 3 第十二章 单元测试 Unit Testing
  • C++与Python:两种编程语言的区别
  • Springboot 高频面试题
  • 常用电脑,护眼软件推荐 f.lux 3400K | 撰写论文 paper
  • MacOS下使用Ollama本地构建DeepSeek并使用本地Dify构建AI应用