news 2026/5/12 19:16:25

如何利用jQuery实现大文件的分片上传和断点续传?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何利用jQuery实现大文件的分片上传和断点续传?

2023年X月X日 开发日志 - 大文件传输系统攻坚实录

凌晨1:30,合肥的暴雨敲打着窗户,我正在为这个极具挑战的外包项目设计技术方案。客户的需求相当硬核——基于WebUploader实现20G级文件夹传输,还要兼容IE8这个"上古神器"。泡了杯浓茶,记录下今天的突破性进展。


核心问题拆解

  1. 文件夹结构保持:WebUploader原生只支持文件选择
  2. IE8兼容性:现代API如FileSystem API完全不可用
  3. 断点持久化:需要跨越浏览器会话的进度保存
  4. 非打包下载:避免服务器压缩数万文件的性能灾难

关键技术突破

1. 文件夹结构采集方案

通过分析Windows/MacOS的目录选择行为,发现隐藏的webkitdirectory属性:

配套的Vue3处理逻辑:

// folder-processor.jsexportconstscanFolder=(entries,path='')=>{constitems=[]for(constentryofentries){constitem={path:path+entry.name,isFile:entry.isFile}if(entry.isFile){item.file=entry items.push(item)}else{items.push({...item,children:awaitscanFolder(awaitreadDirectory(entry),path+entry.name+'/')})}}returnitems}
2. 断点续传持久化设计

采用三级缓存机制确保可靠性:

  1. IndexedDB:存储分片二进制数据(现代浏览器)
  2. localStorage:存储元信息(兼容IE8)
  3. 服务端校验:最终一致性保障
// C# 断点状态服务publicclassUploadStateService{privatereadonlystring_connStr;publicasyncTaskGetStateAsync(stringfileKey){usingvarconn=newSqlConnection(_connStr);returnawaitconn.QueryFirstOrDefaultAsync(@"SELECT * FROM UploadStates WHERE FileKey = @fileKey AND UserId = @userId",new{fileKey,UserContext.Current.UserId});}publicasyncTaskSaveChunkAsync(FileChunkchunk){// 采用UPSERT模式varsql=@" MERGE INTO UploadChunks AS target USING (VALUES (@chunkId, @fileKey, @chunkNumber)) AS source(...) ON target.ChunkId = source.chunkId WHEN MATCHED THEN UPDATE SET ... WHEN NOT MATCHED THEN INSERT (...) VALUES (...)";awaitconn.ExecuteAsync(sql,chunk);}}
3. 非打包下载实现

利用阿里云OSS的列举和签名机制:

// FileController.cs[HttpGet("download")]publicasyncTaskDownloadFolder(stringpath){varobjects=await_ossService.ListObjectsAsync(path);varmanifest=objects.Select(o=>new{Key=o.Key,Url=_ossService.GeneratePresignedUrl(o.Key)});returnJson(new{Type="folder",Manifest=manifest,BasePath=path});}

前端处理逻辑:

// download-manager.jsexportconstdownloadFolder=async(manifest)=>{for(constitemofmanifest){constrelativePath=item.Key.replace(manifest.BasePath,'')awaitcreateLocalDirectory(relativePath)constresponse=awaitfetch(item.Url)constblob=awaitresponse.blob()saveAs(blob,relativePath.split('/').pop())}}

IE8兼容性魔改实录

在QQ群(374992201)里与几位前辈探讨后,采用以下黑科技:

// ie8-compat.jsdocument.attachEvent('onclick',function(){if(window.ActiveXObject){// 使用古老的FileSystemObjectvarfso=newActiveXObject("Scripting.FileSystemObject")varfolder=fso.GetFolder(selectedPath)traverseFolder(folder)}})functiontraverseFolder(folder){varfiles=newEnumerator(folder.files)for(;!files.atEnd();files.moveNext()){postFile(files.item())}varsubfolders=newEnumerator(folder.subfolders)for(;!subfolders.atEnd();subfolders.moveNext()){traverseFolder(subfolders.item())}}

项目进度与反思

  • ✅ 已完成:
    • 文件夹元数据采集方案
    • 基础分片上传功能
  • ⏳ 进行中:
    • 断点状态同步逻辑
    • OSS直传优化
  • ❗ 风险点:
    • IE8的ActiveX安全策略可能导致功能受限
    • 超深层级文件夹的性能问题

深夜的键盘声格外清晰,这个项目让我深刻体会到——兼容IE8就像考古学家修复青铜器,需要特殊的工具和极大的耐心。明天将继续完善分片合并逻辑,或许该考虑引入Web Worker来避免界面卡顿…

(文档持续更新中,完整代码请关注QQ群文件更新)

设置框架

安装.NET Framework 4.7.2
https://dotnet.microsoft.com/en-us/download/dotnet-framework/net472
框架选择4.7.2

添加3rd引用

编译项目

NOSQL

NOSQL无需任何配置可直接访问页面进行测试

SQL

使用IIS
大文件上传测试推荐使用IIS以获取更高性能。

使用IIS Express

小文件上传测试可以使用IIS Express

创建数据库

配置数据库连接信息

检查数据库配置

访问页面进行测试


相关参考:
文件保存位置,

效果预览

文件上传

文件刷新续传

支持离线保存文件进度,在关闭浏览器,刷新浏览器后进行不丢失,仍然能够继续上传

文件夹上传

支持上传文件夹并保留层级结构,同样支持进度信息离线保存,刷新页面,关闭页面,重启系统不丢失上传进度。

下载完整示例

下载完整示例

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/12 19:15:35

农业大数据平台如何处理Word表格的Web端编辑?

【开发日记:Word图片一键转存大作战——从“秃头警告”到“真香现场”】 2023年X月X日 周X 晴(但我的头顶在下雨) 第一章:需求诞生——甲方爸爸的“五彩斑斓黑” 今天导师突然发来一个“小需求”:给我的CMS系统后台新…

作者头像 李华
网站建设 2026/5/1 14:59:36

基于Python的热门旅游景点数据分析系统的设计与实现

《基于Python的热门旅游景点数据分析系统的设计与实现》该项目采用技术Python的django框架、mysql数据库 ,项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、核心代码介绍视频等软件开发环境及开发工具:开发语言:python使…

作者头像 李华
网站建设 2026/5/12 11:06:57

Qwen2.5-Coder-1.5B基础教程:SwiGLU激活函数对代码token预测增益

Qwen2.5-Coder-1.5B基础教程:SwiGLU激活函数对代码token预测增益 1. 为什么关注Qwen2.5-Coder-1.5B? 你可能已经用过不少代码生成模型,但有没有遇到过这些情况:写Python函数时变量名总不太地道,补全一段SQL却漏掉了分…

作者头像 李华
网站建设 2026/5/12 11:06:09

例说FPGA:可直接用于工程项目的第一手经验【3.1】

第13章 工程实例11——FX2硬件和驱动安装以及Bulkloop实验 本章导读 本章不涉及FPGA工程,主要是对Cypress的USB2.0控制器芯片CY7C68013进行基本的编程测试,为后续的FPGA与其通信做准备工作。 13.1 功能概述 FX2(CY7C68013)是一款集成8051单片机的灵活的USB2.0控制器,其…

作者头像 李华
网站建设 2026/5/12 11:05:39

ccmusic-database开源镜像价值:省去30小时CV模型微调过程,开箱即用

ccmusic-database开源镜像价值:省去30小时CV模型微调过程,开箱即用 你有没有试过为一段30秒的钢琴曲判断它属于古典、爵士还是新世纪音乐?或者想快速给一批用户上传的短视频配乐打上“流行”“摇滚”“电子”标签?传统做法是——…

作者头像 李华
网站建设 2026/5/12 11:06:29

计算机毕业设计springboot食堂食材管理系统 基于SpringBoot的餐饮原材料智能管控平台 SpringBoot框架下的食堂供应链与库存信息化系统

计算机毕业设计springboot食堂食材管理系统906k1r0g (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 随着社会对食品安全与营养健康关注度的持续提升,食堂作为学校、…

作者头像 李华