news 2026/7/4 9:29:21

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/7/3 16:21:02

PandasAI数据分析入门:3步实现智能数据对话

PandasAI数据分析入门&#xff1a;3步实现智能数据对话 【免费下载链接】pandas-ai 该项目扩展了Pandas库的功能&#xff0c;添加了一些面向机器学习和人工智能的数据处理方法&#xff0c;方便AI工程师利用Pandas进行更高效的数据准备和分析。 项目地址: https://gitcode.com…

作者头像 李华
网站建设 2026/7/3 17:40:47

Cider音乐播放器完整指南:解锁跨平台Apple Music新体验

Cider音乐播放器完整指南&#xff1a;解锁跨平台Apple Music新体验 【免费下载链接】Cider A new cross-platform Apple Music experience based on Electron and Vue.js written from scratch with performance in mind. &#x1f680; 项目地址: https://gitcode.com/gh_mi…

作者头像 李华
网站建设 2026/7/3 17:40:13

OpenJob深度解析:5分钟掌握开源分布式任务调度框架

OpenJob深度解析&#xff1a;5分钟掌握开源分布式任务调度框架 【免费下载链接】openjob Distributed high performance task scheduling framework 项目地址: https://gitcode.com/gh_mirrors/op/openjob 在当今微服务架构盛行的时代&#xff0c;定时任务和延迟处理已成…

作者头像 李华
网站建设 2026/7/1 20:14:56

医院预约挂号脚本

医院预约挂号脚本 功能介绍 本脚本是一个用 Python 编写的医院预约挂号程序&#xff0c;支持以下功能&#xff1a; 自动预约&#xff1a;通过api交互选择医院、科室、医生和时间段。自动监控&#xff1a;持续检查指定医生的号源状态&#xff0c;发现可预约时段时自动尝试预约…

作者头像 李华