大文件上传Demo及面试要点

news2025/4/25 15:16:36

大文件上传功能实现原理 - 面试解析

在面试中解释大文件上传功能的实现原理时,可以从以下几个方面进行说明:

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('文件校验失败');
}

优势

  • 确保上传文件完整无误
  • 防止传输过程中数据损坏

面试回答示例

"我们的大文件上传方案主要解决了传统单次上传大文件时的超时、中断和用户体验问题。核心实现原理包括:

  1. 分片上传 :将文件分割为5MB大小的分片独立上传,避免单次请求过大导致的超时问题。前端使用File API的slice方法分割文件,每个分片携带索引和总数等元数据。
  2. 断点续传 :通过计算文件内容哈希作为唯一标识。上传前先查询服务端已接收的分片,只上传缺失部分。这显著提高了上传的可靠性和效率。
  3. 进度控制 :实时跟踪已上传分片数量和大小,计算并显示上传百分比。同时实现了暂停/继续功能,使用AbortController控制请求中断。
  4. 文件合并 :所有分片上传完成后,服务端按索引顺序合并分片为完整文件。合并前会校验分片数量,合并后删除临时文件释放空间。
  5. 错误处理 :实现了网络中断自动重试、哈希校验等机制确保数据完整性。

这套方案在实际应用中支持了GB级文件的上传,成功率从原来的60%提升到了99%以上,同时提供了良好的用户体验。"

Demo
https://github.com/longjinxiang/fileUploadDemo

后端依赖安装

在运行后端代码前,需要安装以下依赖:

npm install express multer cors

功能说明

这个Demo实现了以下功能:

  1. 分片上传 :将大文件分割成多个小分片上传
  2. 断点续传 :上传中断后可以从中断处继续上传
  3. 进度显示 :实时显示上传进度
  4. 暂停/继续 :可以暂停上传并在之后继续
  5. 文件合并 :所有分片上传完成后,服务器合并分片为完整文件

代码结构说明

前端部分

  1. 文件选择 :用户通过 <input type="file">选择文件
  2. 哈希计算 :为文件生成唯一标识(简化版,实际应用应使用更可靠的哈希算法)
  3. 分片上传 :将文件分割为多个分片并依次上传
  4. 进度跟踪 :跟踪已上传的分片数量并更新进度条
  5. 暂停/继续 :使用AbortController实现请求中止和继续上传
  6. 合并请求 :所有分片上传完成后通知服务器合并文件

后端部分

  1. 分片检查 :检查已上传的分片信息
  2. 分片接收 :接收并保存上传的文件分片
  3. 文件合并 :将所有分片合并为完整文件
  4. 临时文件管理 :使用文件哈希作为临时目录名,便于管理分片

实际应用中的改进建议

  1. 更安全的文件哈希 :使用SHA-256等算法计算文件哈希
  2. 文件校验 :合并完成后校验文件完整性
  3. 文件清理 :定期清理未完成的临时分片
  4. 身份验证 :添加上传权限验证
  5. 文件存储 :使用云存储服务如S3替代本地存储
  6. 并发控制 :限制同时上传的分片数量
  7. 错误处理 :更完善的错误处理和重试机制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2342513.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过阿里云Milvus与通义千问VL大模型,快速实现多模态搜索

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

使用 Spring Boot Admin 通过图形界面查看应用配置信息的完整配置详解,包含代码示例和注释,最后以表格总结关键配置

以下是使用 Spring Boot Admin 通过图形界面查看应用配置信息的完整配置详解&#xff0c;包含代码示例和注释&#xff0c;最后以表格总结关键配置&#xff1a; 1. 环境准备 Spring Boot 版本&#xff1a;2.7.x&#xff08;兼容 Spring Boot Admin 2.x&#xff09;Spring Boot…

【计算机视觉】CV实战项目 - 基于YOLOv5与DeepSORT的智能交通监控系统:原理、实战与优化

基于YOLOv5与DeepSORT的智能交通监控系统&#xff1a;原理、实战与优化 一、项目架构与技术解析1.1 核心算法架构1.2 学术基础 二、实战环境配置2.1 硬件要求与系统配置2.2 分步安装指南 三、核心功能实战3.1 基础车辆计数3.2 自定义检测类别3.3 多区域计数配置 四、性能优化技…

17.磁珠在EMC设计中的运用

磁珠在EMC设计中的运用 1. 磁珠的高频等效特性2. 磁珠的参数分析与选型3. 磁珠应用中的隐患问题 1. 磁珠的高频等效特性 和磁环类似&#xff0c;低频段感性jwL为主&#xff0c;高频段阻性R为主。 2. 磁珠的参数分析与选型 不需要太在意磁珠在100MHz时的电阻值&#xff0c;选型…

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年的具体发展计划&#xff0c;旨在塑造去中心化算力的未来。本次活动汇集了DPIN、QPIN、社区成员和Web3行业资深顾问&#xff0c;深入探讨DPIN构建全球领先的去中心化GPU算力网络的战略&#xff0c;该网络…

Visual Studio Code 使用tab键往左和往右缩进内容

使用VSCode写东西&#xff0c;经常遇到多行内容同时缩进的情况&#xff0c;今天写文档的时候就碰到&#xff0c;记录下来&#xff1a; 往右缩进 选中多行内容&#xff0c;点tab键&#xff0c;会整体往右缩进&#xff1a; 往左缩进 选中多行内容&#xff0c;按shifttab&am…

HTML、XHTML 和 XML区别

HTML、XHTML 和 XML 这三兄弟的区别 HTML: 老大哥,负责网页长啥样,性格比较随和,有点小错误也能容忍。XHTML: 二哥,看着像 HTML,但规矩严,是按 XML 的规矩来的 HTML,更规范。XML: 小弟,负责存储和传输数据,非常灵活,标签可以自己随便定,但规矩最严。它们仨长啥样?(…

FPGA上实现YOLOv5的一般过程

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

4U带屏基于DSP/ARM+FPGA+AI的电力故障录波装置设计方案,支持全国产化

4U带屏DSP/ARMFPGAAI电力故障录波分析仪&#xff0c;支持国产化&#xff0c;含有CPU主控模块&#xff0c;96路模拟量采集&#xff0c;256路开关量&#xff0c;通讯扩展卡等#电力故障录波#4U带屏#新能源#电力监测 主要特点 1&#xff09;是采用嵌入式图形系统&#xff0c;以及…

数据库数据删除与修改实验

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

【含文档+PPT+源码】基于SpringBoot+vue的疫苗接种系统的设计与实现

项目介绍 本课程演示的是一款 基于SpringBootvue的疫苗接种系统的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系…

项目自动化测试

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

Python爬虫爬取图片并存储到MongoDB(注意:仅尝试存储一条空的示例数据到MongoDB,验证MongoDB的联通性)

以下是一个使用Python爬取图片并存储到MongoDB的示例实现&#xff0c;包含详细步骤说明&#xff1a; import requests from bs4 import BeautifulSoup from pymongo import MongoClient from datetime import datetime import os import re# 配置信息 mongoIP mongodb://root…

L1-1、Prompt 是什么?为什么它能“控制 AI”?

*Prompt 入门 L1-1 想象一下&#xff0c;你只需输入一句话&#xff0c;AI 就能自动为你写一篇文案、生成一份报告、甚至规划你的创业计划。这种“对话即编程”的背后魔法&#xff0c;就是 Prompt 的力量。 &#x1f50d; 一、Prompt 的定义与由来 Prompt&#xff08;提示词&am…

TIM输入捕获知识部分

越往左&#xff0c;频率越高&#xff1b;越往右&#xff0c;频率越低。【越紧凑&#xff0c;相同时间&#xff0c;次数越多】 计算频率的方法&#xff1a;测评法、测周法、中界频率。 频率的定义&#xff1a;1s内出现了多少个重复的周期 测评法就是从频率的定义出发的&#…

PCB常见封装类型

1. 电阻、电容、电感封装 2. 二极管、三极管封 3. 排阻类器件&#xff08;8脚、16脚&#xff09;封装 4. SO类器件&#xff08;间距有1.27、2.54mm等&#xff09;封装 5. QFP类器件封装&#xff08;四方扁平封装&#xff09; 结构&#xff1a;引脚分布在封装的四个侧面&#…

【Linux】调试工具gdb的认识和使用指令介绍(图文详解)

目录 1、debug和release的知识 2、gdb的使用和常用指令介绍&#xff1a; &#xff08;1&#xff09;、windows下调试的功能&#xff1a; &#xff08;2&#xff09;、进入和退出&#xff1a; &#xff08;3&#xff09;、调试过程中的相关指令&#xff1a; 3、调试究竟是在…

UML设计系列(9):开发过程中如何应用UML

传送门 UML设计系列(1)&#xff1a;状态机图 UML设计系列(2)&#xff1a;类图 UML设计系列(3)&#xff1a;时序图 UML设计系列(4)&#xff1a;用例图 UML设计系列(5)&#xff1a;系统依赖图 UML设计系列(6)&#xff1a;活动图 UML设计系列(7)&#xff1a;UML设计阶段性总…

模板方法模式:定义算法骨架的设计模式

模板方法模式&#xff1a;定义算法骨架的设计模式 一、模式核心&#xff1a;模板方法定义算法骨架&#xff0c;具体步骤延迟到子类实现 在软件开发中&#xff0c;经常会遇到这样的情况&#xff1a;某个算法的步骤是固定的&#xff0c;但具体步骤的实现可能因不同情况而有所不…