大文件上传Demo及面试要点
大文件上传功能实现原理 - 面试解析
在面试中解释大文件上传功能的实现原理时,可以从以下几个方面进行说明:
1. 分片上传 (Chunked Upload)
实现原理 :
- 前端将大文件分割为固定大小(如5MB)的多个分片(Chunk)
- 每个分片独立上传,携带分片索引、总分片数等元数据
- 后端接收并存储每个分片到临时目录
- 所有分片上传完成后,前端通知后端合并分片
技术要点 :
// 前端分片代码示例
const chunk = file.slice(start, end); // 使用slice方法分割文件
formData.append('chunkIndex', chunkIndex); // 携带分片索引
优势 :
- 避免单次上传大文件导致的超时问题
- 网络中断后可只重传失败分片
- 可以并行上传多个分片提高速度
2. 断点续传 (Resumable Upload)
实现原理 :
- 前端计算文件唯一标识(如文件内容哈希)
- 上传前先查询服务端已上传的分片信息
- 只上传缺失的分片,跳过已上传部分
- 服务端根据文件标识管理分片状态
技术要点 :
// 文件哈希计算(简化版)
async function calculateFileHash(file) {// 实际项目应使用SHA-256等算法return `${file.name}-${file.size}`;
}// 检查已上传分片
const { uploadedChunks } = await checkUploadedChunks(fileName, fileHash);
优势 :
- 网络中断后可从断点继续上传
- 避免重复上传已成功分片
- 提高上传可靠性
3. 进度显示 (Upload Progress)
实现原理 :
- 前端记录已上传分片数量和总大小
- 基于已上传大小和文件总大小计算百分比
- 通过事件或轮询更新UI进度条
技术要点 :
// 进度更新函数
function updateProgress() {const progress = (uploadedSize / fileSize) * 100;progressBar.style.width = `${progress}%`;
}// 每个分片上传成功后更新
uploadedSize += chunk.size;
updateProgress();
优势 :
- 提供良好的用户体验
- 让用户了解上传状态和剩余时间
4. 暂停/继续 (Pause/Resume)
实现原理 :
- 使用AbortController中止正在进行的上传请求
- 暂停时保存当前上传状态(已上传分片)
- 继续时从上次中断的分片开始上传
技术要点 :
// 创建可中止的请求
controller = new AbortController();
fetch('/api/upload', {signal: controller.signal
});// 暂停上传
controller.abort();
优势 :
- 用户可主动控制上传过程
- 节省带宽和服务器资源
5. 文件合并 (File Merging)
实现原理 :
- 前端在所有分片上传完成后发送合并请求
- 后端按分片索引顺序读取所有分片
- 将分片数据按顺序写入最终文件
- 合并完成后删除临时分片
技术要点 :
// 后端合并代码示例
chunks.sort((a, b) => a - b); // 按索引排序
for (const chunk of chunks) {const data = fs.readFileSync(chunkPath);writeStream.write(data); // 顺序写入
}
优势 :
- 确保文件完整性
- 释放临时存储空间
6. 文件校验 (File Verification)
实现原理 :
- 前端计算完整文件的哈希值并随合并请求发送
- 后端合并完成后重新计算文件哈希
- 比对两个哈希值确保文件完整性
技术要点 :
// 建议的哈希校验流程
const clientHash = req.body.fileHash; // 客户端计算的哈希
const serverHash = calculateServerFileHash(finalPath); // 服务端计算if (clientHash !== serverHash) {throw new Error('文件校验失败');
}
优势 :
- 确保上传文件完整无误
- 防止传输过程中数据损坏
面试回答示例
"我们的大文件上传方案主要解决了传统单次上传大文件时的超时、中断和用户体验问题。核心实现原理包括:
- 分片上传 :将文件分割为5MB大小的分片独立上传,避免单次请求过大导致的超时问题。前端使用File API的slice方法分割文件,每个分片携带索引和总数等元数据。
- 断点续传 :通过计算文件内容哈希作为唯一标识。上传前先查询服务端已接收的分片,只上传缺失部分。这显著提高了上传的可靠性和效率。
- 进度控制 :实时跟踪已上传分片数量和大小,计算并显示上传百分比。同时实现了暂停/继续功能,使用AbortController控制请求中断。
- 文件合并 :所有分片上传完成后,服务端按索引顺序合并分片为完整文件。合并前会校验分片数量,合并后删除临时文件释放空间。
- 错误处理 :实现了网络中断自动重试、哈希校验等机制确保数据完整性。
这套方案在实际应用中支持了GB级文件的上传,成功率从原来的60%提升到了99%以上,同时提供了良好的用户体验。"
Demo
https://github.com/longjinxiang/fileUploadDemo
后端依赖安装
在运行后端代码前,需要安装以下依赖:
npm install express multer cors
功能说明
这个Demo实现了以下功能:
- 分片上传 :将大文件分割成多个小分片上传
- 断点续传 :上传中断后可以从中断处继续上传
- 进度显示 :实时显示上传进度
- 暂停/继续 :可以暂停上传并在之后继续
- 文件合并 :所有分片上传完成后,服务器合并分片为完整文件
代码结构说明
前端部分
- 文件选择 :用户通过
<input type="file">
选择文件 - 哈希计算 :为文件生成唯一标识(简化版,实际应用应使用更可靠的哈希算法)
- 分片上传 :将文件分割为多个分片并依次上传
- 进度跟踪 :跟踪已上传的分片数量并更新进度条
- 暂停/继续 :使用AbortController实现请求中止和继续上传
- 合并请求 :所有分片上传完成后通知服务器合并文件
后端部分
- 分片检查 :检查已上传的分片信息
- 分片接收 :接收并保存上传的文件分片
- 文件合并 :将所有分片合并为完整文件
- 临时文件管理 :使用文件哈希作为临时目录名,便于管理分片
实际应用中的改进建议
- 更安全的文件哈希 :使用SHA-256等算法计算文件哈希
- 文件校验 :合并完成后校验文件完整性
- 文件清理 :定期清理未完成的临时分片
- 身份验证 :添加上传权限验证
- 文件存储 :使用云存储服务如S3替代本地存储
- 并发控制 :限制同时上传的分片数量
- 错误处理 :更完善的错误处理和重试机制
相关文章:
大文件上传Demo及面试要点
大文件上传功能实现原理 - 面试解析 在面试中解释大文件上传功能的实现原理时,可以从以下几个方面进行说明: 1. 分片上传 (Chunked Upload) 实现原理 : 前端将大文件分割为固定大小(如5MB)的多个分片(Chunk)每个分片独立上传,…...

通过阿里云Milvus与通义千问VL大模型,快速实现多模态搜索
本文主要演示了如何使用阿里云向量检索服务Milvus版与通义千问VL大模型,提取图片特征,并使用多模态Embedding模型,快速实现多模态搜索。 基于灵积(Dashscope)模型服务上的通义千问 API以及Embedding API来接入图片、文…...

使用 Spring Boot Admin 通过图形界面查看应用配置信息的完整配置详解,包含代码示例和注释,最后以表格总结关键配置
以下是使用 Spring Boot Admin 通过图形界面查看应用配置信息的完整配置详解,包含代码示例和注释,最后以表格总结关键配置: 1. 环境准备 Spring Boot 版本:2.7.x(兼容 Spring Boot Admin 2.x)Spring Boot…...
解决NSMutableData appendData性能开销太大的问题
用以下高效方式,原理上是不复制内存: dispatch_data_t accumulatedData dispatch_data_empty; // 假设我们有多个数据块需要合并 for (NSData *chunk in dataChunks) { dispatch_data_t chunkData dispatch_data_create(chunk.bytes, chunk.length, …...
雪花算法生成int64,在前端js的精度问题
1.问题背景 后端对视频生成唯一性id,在发送评论阶段,由于后端接收的json数据格式,设置videoId为int64。前端于是使用js的Number函数,进行字符串转换为数字,由于不清楚js的精度范围,产生了携带的videoId变化…...

【计算机视觉】CV实战项目 - 基于YOLOv5与DeepSORT的智能交通监控系统:原理、实战与优化
基于YOLOv5与DeepSORT的智能交通监控系统:原理、实战与优化 一、项目架构与技术解析1.1 核心算法架构1.2 学术基础 二、实战环境配置2.1 硬件要求与系统配置2.2 分步安装指南 三、核心功能实战3.1 基础车辆计数3.2 自定义检测类别3.3 多区域计数配置 四、性能优化技…...
2025年3月电子学会青少年机器人技术(四级)等级考试试卷-实际操作-测评师
青少年机器人技术等级考试实际操作试卷(四级)-测评师 分数:100 题数:2 一、电路搭设(共1题,共20分) 1. 元器件: (1)装置中包含交通灯模块(或元器件);(2分…...

17.磁珠在EMC设计中的运用
磁珠在EMC设计中的运用 1. 磁珠的高频等效特性2. 磁珠的参数分析与选型3. 磁珠应用中的隐患问题 1. 磁珠的高频等效特性 和磁环类似,低频段感性jwL为主,高频段阻性R为主。 2. 磁珠的参数分析与选型 不需要太在意磁珠在100MHz时的电阻值,选型…...
React vs Vue:性能对决
React vs Vue:性能对决 🚀 渲染机制流程图 #mermaid-svg-LWSKliWNGUh9tZcM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-LWSKliWNGUh9tZcM .error-icon{fill:#552222;}#mermaid-svg-LWSKliWNGUh9tZcM .error-…...

Mediamtx与FFmpeg远程与本地推拉流使用
1.本地推拉流 启服 推流 ffmpeg -re -stream_loop -1 -i ./DJI_0463.MP4 -s 1280x720 -an -c:v h264 -b:v 2000k -maxrate 2500k -minrate 1500k -bufsize 3000k -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/stream 拉流 ffplay -rtsp_transport tcp rtsp://43.136.…...

DPIN在AI+DePIN孟买峰会阐述全球GPU生态系统的战略愿景
DPIN基金会在3月29日于印度孟买举行的AIDePIN峰会上展示了其愿景和未来5年的具体发展计划,旨在塑造去中心化算力的未来。本次活动汇集了DPIN、QPIN、社区成员和Web3行业资深顾问,深入探讨DPIN构建全球领先的去中心化GPU算力网络的战略,该网络…...
React:<></>的存在是为了什么
1. <></> 是什么? <></> 是 React 的Fragment(片段)语法糖,等价于 <React.Fragment></React.Fragment>。 2. 它的作用 主要作用: 允许你在组件里返回多个元素,而不需…...
Android Build Variants(构建变体)详解
Android Build Variants(构建变体)是 Android 开发中用于生成不同版本应用程序的一种机制。它允许开发者根据不同的需求,如不同的应用市场、不同的功能模块、不同的环境配置等,从同一个代码库中生成多个不同的 APK。 组成部分 B…...

Visual Studio Code 使用tab键往左和往右缩进内容
使用VSCode写东西,经常遇到多行内容同时缩进的情况,今天写文档的时候就碰到,记录下来: 往右缩进 选中多行内容,点tab键,会整体往右缩进: 往左缩进 选中多行内容,按shifttab&am…...
【KWDB 创作者计划】_嵌入式硬件篇---寄存器与存储器截断与溢出
文章目录 前言一、寄存器与存储器1. 定义与基本概念寄存器(Register)位置功能特点存储器(Memory)位置功能特点2. 关键区别3. 层级关系与协作存储层次结构协作示例4. 为什么需要寄存器性能优化指令支持减少总线竞争5. 其他寄存器类型专用寄存器程序计数器(PC)栈指针(SP)…...
Python中的 for 与 迭代器
文章目录 一、for 循环的底层机制示例:手动模拟 for 循环 二、可迭代对象 vs 迭代器关键区别: 三、for 循环的典型应用场景1. 遍历序列类型2. 遍历字典3. 结合 range() 生成数字序列4. 遍历文件内容 四、迭代器的自定义实现示例:生成斐波那契…...
C语言编程--15.四数之和
题目: 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复)&…...

HTML、XHTML 和 XML区别
HTML、XHTML 和 XML 这三兄弟的区别 HTML: 老大哥,负责网页长啥样,性格比较随和,有点小错误也能容忍。XHTML: 二哥,看着像 HTML,但规矩严,是按 XML 的规矩来的 HTML,更规范。XML: 小弟,负责存储和传输数据,非常灵活,标签可以自己随便定,但规矩最严。它们仨长啥样?(…...
LeetCode 2799.统计完全子数组的数目:滑动窗口(哈希表)
【LetMeFly】2799.统计完全子数组的数目:滑动窗口(哈希表) 力扣题目链接:https://leetcode.cn/problems/count-complete-subarrays-in-an-array/ 给你一个由 正 整数组成的数组 nums 。 如果数组中的某个子数组满足下述条件&am…...
【高中数学/古典概率】4红2黑六选二,求取出两次都是红球的概率
【问题】 袋子里装4只红球,2只黑球,大小完全相同,抽两次球,每次抽一只,抽出后不再放回,求取出的两次都是红球的概率。 【来源】 数林外传系列之《概率与期望》P20 单埻著 中国科学技术大学出版社 【数学…...
QLExpress 深度解析:构建动态规则引擎的利器
QLExpress 深度解析:构建动态规则引擎的利器 在现代业务系统中,“规则变更快、逻辑复杂、发布要求高”已成为常态。传统硬编码已无法满足这种需求。本文以阿里巴巴开源的轻量级表达式引擎 QLExpress 为例,从实际应用、核心结构到落地建议,系统解析其强大能力和设计哲学。 …...
aarcpy 列表函数的使用(1)
arcpy.ListFeatureClasses() 该函数用于列出指定工作空间中的所有要素类。可以通过通配符和过滤条件进一步筛选结果。 语法: python arcpy.ListFeatureClasses(wild_cardNone, feature_typeNone)• wild_card:用于筛选要素类名称的通配符,…...
C++学习笔记(三十七)——STL之搜索算法
STL 算法分类: 类别常见算法作用排序sort、stable_sort、partial_sort、nth_element等排序搜索find、find_if、count、count_if、binary_search等查找元素修改copy、replace、replace_if、swap、fill等修改容器内容删除remove、remove_if、unique等删除元素归约for…...
MySQL 9.3 正式发布!备份、用户管理与开发支持迎来革命性升级
开源数据库领域的标杆产品MySQL迎来重大更新——MySQL 9.3正式发布!作为企业级数据库的“扛把子”,此次版本更新聚焦备份效率、用户管理精细化、开发支持增强三大核心领域,同时在高可用性和性能优化上实现突破。以下为你逐一解读新版本的亮点…...

FPGA上实现YOLOv5的一般过程
在FPGA上实现YOLOv5 YOLO算法现在被工业界广泛的应用,虽说现在有很多的NPU供我们使用,但是我们为了自己去实现一个NPU所以在本文中去实现了一个可以在FPGA上运行的YOLOv5。 YOLOv5的开源代码链接为 https://github.com/ultralytics/yolov5 为了在FPGA中…...

4U带屏基于DSP/ARM+FPGA+AI的电力故障录波装置设计方案,支持全国产化
4U带屏DSP/ARMFPGAAI电力故障录波分析仪,支持国产化,含有CPU主控模块,96路模拟量采集,256路开关量,通讯扩展卡等#电力故障录波#4U带屏#新能源#电力监测 主要特点 1)是采用嵌入式图形系统,以及…...

数据库数据删除与修改实验
数据库数据删除与修改实验 在数据库原理的学习中,数据的删除与修改是核心操作技能。通过“删除修改数据”实验,我系统实践了 SQL 中 UPDATE 和 DELETE 语句的多种应用场景,从基础语法到复杂业务逻辑处理,积累了丰富的实战经验。本…...

【含文档+PPT+源码】基于SpringBoot+vue的疫苗接种系统的设计与实现
项目介绍 本课程演示的是一款 基于SpringBootvue的疫苗接种系统的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系…...
如何将IDP映射属性添加,到accountToken中 方便项目获取登录人信息
✅ 目标 你想要: 用户通过 IdP 登录(SAML 或 OAuth2)Keycloak 自动将 IdP 返回的属性(如:email、name、role 等)映射到用户账户中并把这些属性加入到用户登录返回的 Access Token 中,供业务系…...

项目自动化测试
一.设计测试用例(细致全面) 二.先引入所需要的pom.xml依赖 1.selenium依赖 2.webdrivermanager依赖 3.commons-io依赖 编写测试用例–按照页面对用例进行划分,每个页面是Java文件,页面下的所有用例统一管理 三.common包(放入公用包) 类1utils 可以调用driver对象,访问url …...