news 2026/9/14 11:26:45

HTML如何实现网页大文件上传的拖拽功能?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HTML如何实现网页大文件上传的拖拽功能?

开发日记:大文件上传系统攻坚记
日期:2023年XX月XX日
天气:晴(但心情像在调试IE8的阴天)


一、需求拆解:从"不可能"到"可能"

客户的需求像一座高山:

  • 20G文件传输(阿里云OSS单文件上限5TB,但浏览器内存是瓶颈)
  • IE8兼容(默默掏出XDomainRequestActiveXObject的祖传代码)
  • 文件夹层级保留(需递归处理``的FileSystemEntryAPI)
  • 断点续传+加密(分片上传+本地存储恢复点+Web Crypto API)

技术选型

  • 放弃WebUploader(IE8支持不足),选择原生JS+H5 File API
  • 加密方案:SM4/AES通过forge.js兼容旧浏览器
  • 断点续传:localStorage+服务端分片记录

二、前端核心代码:文件夹上传与断点续传

1. 文件夹上传(递归扫描)
// 获取文件夹所有文件(兼容IE10+,IE8需ActiveX降级方案)asyncfunctionscanDirectory(directory){constfiles=[];conststack=[directory];while(stack.length){constentry=stack.pop();if(entry.isFile){files.push(awaitgetFile(entry));}elseif(entry.isDirectory){constreader=entry.createReader();constentries=awaitnewPromise(resolve=>reader.readEntries(resolve));stack.push(...entries);}}returnfiles;}// IE8降级方案(需用户手动选择多个文件)functionhandleIE8Fallback(){constinput=document.createElement('input');input.type='file';input.multiple=true;input.onchange=()=>uploadFiles(input.files);input.click();}
2. 分片上传+断点续传
classChunkUploader{constructor(file,options){this.file=file;this.chunkSize=5*1024*1024;// 5MB/chunkthis.totalChunks=Math.ceil(file.size/this.chunkSize);this.uploadedChunks=JSON.parse(localStorage.getItem(file.name)||'[]');}asyncupload(){for(leti=0;i<this.totalChunks;i++){if(this.uploadedChunks.includes(i))continue;constchunk=this.file.slice(i*this.chunkSize,(i+1)*this.chunkSize);awaitthis.sendChunk(chunk,i);this.uploadedChunks.push(i);localStorage.setItem(this.file.name,JSON.stringify(this.uploadedChunks));}}asyncsendChunk(chunk,index){constformData=newFormData();formData.append('chunk',chunk);formData.append('chunkIndex',index);formData.append('totalChunks',this.totalChunks);formData.append('fileId',btoa(this.file.name+this.file.size));// 唯一标识returnfetch('/api/upload',{method:'POST',body:formData});}}

三、后端C#代码:分片处理与加密存储

1. 分片接收(ASP.NET WebForm)
[WebMethod]publicstaticstringUploadChunk(){HttpPostedFilechunk=HttpContext.Current.Request.Files["chunk"];intindex=int.Parse(HttpContext.Current.Request["chunkIndex"]);stringfileId=HttpContext.Current.Request["fileId"];// 存储分片到临时目录stringtempPath=Path.Combine(Server.MapPath("~/App_Data/Temp"),fileId);Directory.CreateDirectory(tempPath);chunk.SaveAs(Path.Combine(tempPath,index.ToString()));// 检查是否完成if(AllChunksReceived(tempPath,int.Parse(HttpContext.Current.Request["totalChunks"]))){MergeFile(tempPath,fileId);}return"OK";}
2. SM4加密存储(使用BouncyCastle库)
publicstaticvoidEncryptToOSS(Streaminput,stringossKey){varengine=newSM4Engine();varkey=Encoding.UTF8.GetBytes("16-byte-secret-key");engine.Init(true,newKeyParameter(key));using(varossClient=newOssClient(endpoint,accessKeyId,accessKeySecret))using(varcryptoStream=newCryptoStream(input,engine,CryptoStreamMode.Read)){ossClient.PutObject(bucketName,ossKey,cryptoStream);}}

四、踩坑实录

  1. IE8的棺材板快压不住了
    • 解决方案:对文件夹上传降级为多文件选择,用swfUpload后备方案
  2. 20G文件内存溢出
    • 优化:采用FileReaderreadAsArrayBuffer分段处理
  3. 文件夹层级丢失
    • 关键:上传时携带相对路径,如/科研资料/2023/实验报告.pdf

五、部署与协作

  • 阿里云OSS配置:开启断点续传和跨域规则
  • SQL Server设计
    CREATETABLEFileTransfers(FileIdVARCHAR(255)PRIMARYKEY,OriginalName NVARCHAR(255),OSSPathVARCHAR(255),ChunkCountINT,CompletedChunksVARCHAR(MAX)-- JSON格式存储已上传分片)
  • 接单群协作:代码已上传至群文件(QQ群:374992201),含完整文档

明日计划

  • 测试CentOS下Mono运行ASP.NET的兼容性
  • 编写IE8的ActiveX加密模块(仿佛回到2010年)

签名
—— 一个在古董浏览器和现代需求间挣扎的开发者

设置框架

安装.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/9/13 15:35:48

电池包结构仿真核心课程(2024新版) 该套视频为本人及团队从众多相关视频中挑选整理而出,并添...

电池包结构仿真核心课程(2024新版&#xff09; 该套视频为本人及团队从众多相关视频中挑选整理而出&#xff0c;并添加了一些团队元素&#xff0c;该套视频实属电池仿真领域的精华。 想学习电池包仿真的小伙伴&#xff0c;有这一套视频就够了&#xff0c;不需要再看那些描述的天…

作者头像 李华
网站建设 2026/9/13 9:10:40

Folo多媒体播放器终极指南:移动端音视频播放深度解析

在信息爆炸的时代&#xff0c;如何优雅地消费多媒体内容成为每个用户的痛点。Folo作为下一代信息浏览器&#xff0c;通过精心设计的音视频播放系统解决了这一难题。本文将带你深入探索Folo在移动端如何实现流畅的多媒体播放体验&#xff0c;从技术架构到用户场景&#xff0c;全…

作者头像 李华
网站建设 2026/9/14 8:40:50

Patroni高可用性架构深度解析:从核心原理到生产实践

Patroni高可用性架构深度解析&#xff1a;从核心原理到生产实践 【免费下载链接】patroni A template for PostgreSQL High Availability with Etcd, Consul, ZooKeeper, or Kubernetes 项目地址: https://gitcode.com/gh_mirrors/pat/patroni Patroni作为PostgreSQL高可…

作者头像 李华
网站建设 2026/9/13 11:57:00

StickerBaker:基于Elixir与Phoenix的AI贴纸生成架构解析

StickerBaker&#xff1a;基于Elixir与Phoenix的AI贴纸生成架构解析 【免费下载链接】stickerbaker 项目地址: https://gitcode.com/GitHub_Trending/st/stickerbaker 技术架构价值定位 StickerBaker代表了现代Web应用开发的前沿实践&#xff0c;通过Elixir语言的并发…

作者头像 李华
网站建设 2026/9/13 11:56:52

毕业设计 深度学习yolov11痤疮检测医疗辅助系统(源码+论文)

文章目录0 前言1 项目运行效果2 课题背景2.1、痤疮的医学背景与社会影响2.2、传统痤疮诊断方法的技术局限2.2.1 视觉评估法2.2.2 摄影记录法2.2.3 皮肤镜检测2.3、计算机视觉在皮肤病诊断中的发展3.1 早期图像处理方法(2000-2010)2.3.2 机器学习时代(2011-2015)2.4、深度学习带…

作者头像 李华
网站建设 2026/9/13 15:37:22

AppSync Unified:iOS设备应用签名验证的终极解决方案

AppSync Unified&#xff1a;iOS设备应用签名验证的终极解决方案 【免费下载链接】AppSync Unified AppSync dynamic library for iOS 5 and above. 项目地址: https://gitcode.com/gh_mirrors/ap/AppSync 想要在越狱的iOS设备上自由安装任意IPA应用包吗&#xff1f;App…

作者头像 李华