当前位置: 首页 > news >正文

如何在网页中实现跨平台的大文件切片上传?

一个被20G文件折磨的.NET程序员的求生指南

“甲方爸爸说要兼容IE8?还要20G文件上传?预算100块?” —— 当我看到需求文档时,手里的泡面突然就不香了…🍜

技术方案:在刀尖上跳舞

前端部分:与IE8老爷爷斗智斗勇

// 文件分片上传核心代码(纯手工打造,兼容IE8版)functionuploadFile(file){// IE8特供版检测if(navigator.userAgent.indexOf('MSIE 8.0')>-1){alert('尊敬的用户,检测到您正在使用IE8,我们将为您启用特殊兼容模式...');// 其实就是降级方案...returnie8SpecialUpload(file);}constCHUNK_SIZE=5*1024*1024;// 5MB一片letchunks=Math.ceil(file.size/CHUNK_SIZE);letuploaded=0;// 加密相关(SM4/AES)letcrypto=newSuperCrypto('SM4');// 这个类当然是我编的...for(leti=0;i<chunks;i++){letstart=i*CHUNK_SIZE;letend=Math.min(start+CHUNK_SIZE,file.size);letchunk=file.slice(start,end);// 加密分片letencryptedChunk=crypto.encrypt(chunk);letformData=newFormData();formData.append('file',encryptedChunk);formData.append('chunkIndex',i);formData.append('totalChunks',chunks);formData.append('fileName',file.name);formData.append('fileSize',file.size);// 这里应该是AJAX调用,但为了兼容IE8...letxhr=newXMLHttpRequest();xhr.open('POST','/api/upload',true);xhr.onload=function(){uploaded++;updateProgress(uploaded/chunks*100);saveProgressToLocalStorage(file.name,uploaded);};xhr.send(formData);}}// IE8特供版上传(Flash后备方案)functionie8SpecialUpload(file){// 这里应该有Flash上传代码...alert('请安装Flash Player 10.1或更高版本');returnfalse;}

后端部分:C# WebForm的救赎

// UploadHandler.ashx 文件上传处理publicclassUploadHandler:IHttpHandler{publicvoidProcessRequest(HttpContextcontext){try{// 获取上传的文件分片HttpPostedFilefile=context.Request.Files["file"];intchunkIndex=int.Parse(context.Request["chunkIndex"]);inttotalChunks=int.Parse(context.Request["totalChunks"]);stringfileName=context.Request["fileName"];longfileSize=long.Parse(context.Request["fileSize"]);// 解密处理byte[]fileData=newbyte[file.InputStream.Length];file.InputStream.Read(fileData,0,fileData.Length);byte[]decryptedData=CryptoHelper.SM4Decrypt(fileData,"密钥");// 临时保存分片stringtempPath=Path.Combine("E:\\UploadTemp",fileName);if(!Directory.Exists(tempPath))Directory.CreateDirectory(tempPath);stringchunkPath=Path.Combine(tempPath,chunkIndex.ToString());File.WriteAllBytes(chunkPath,decryptedData);// 检查是否所有分片都已上传if(Directory.GetFiles(tempPath).Length==totalChunks){// 合并文件MergeFile(tempPath,"E:\\Uploads\\"+fileName);Directory.Delete(tempPath,true);// 记录到数据库SaveToDb(fileName,fileSize,"E:\\Uploads\\"+fileName);}context.Response.Write("{\"status\":\"ok\"}");}catch(Exceptionex){context.Response.Write("{\"status\":\"error\",\"message\":\""+ex.Message+"\"}");}}privatevoidMergeFile(stringtempPath,stringtargetPath){// 这里应该有合并文件的代码...}privatevoidSaveToDb(stringfileName,longfileSize,stringfilePath){// 这里应该有数据库操作代码...}}

开发血泪史

  1. IE8兼容性:我尝试了各种黑魔法,最后发现唯一的解决方案是…建议用户换电脑(当然这话不能跟甲方说)

  2. 20G文件上传:我的开发机只有256G SSD,测试时差点把自己电脑搞崩溃

  3. 加密传输:SM4在JavaScript端的实现让我掉了不少头发

文件夹上传的终极解决方案

// 文件夹上传保留层级结构functionuploadFolder(event){letfiles=event.target.files;letfolderStructure={};// 构建文件夹结构for(leti=0;i<files.length;i++){letfile=files[i];if(file.webkitRelativePath){letpaths=file.webkitRelativePath.split('/');letcurrentLevel=folderStructure;for(letj=0;j<paths.length-1;j++){if(!currentLevel[paths[j]]){currentLevel[paths[j]]={};}currentLevel=currentLevel[paths[j]];}currentLevel[paths[paths.length-1]]=file;}}// 递归上传uploadFolderItem(folderStructure,'');}functionuploadFolderItem(item,currentPath){for(letkeyinitem){if(item[key]instanceofFile){// 上传文件uploadFile(item[key],currentPath);}else{// 创建文件夹createFolderOnServer(currentPath+key+'/');// 递归上传子项uploadFolderItem(item[key],currentPath+key+'/');}}}

数据库设计(SQL Server版)

-- 文件记录表CREATETABLEFileRecords(Id UNIQUEIDENTIFIERPRIMARYKEYDEFAULTNEWID(),FileName NVARCHAR(255)NOTNULL,FileSizeBIGINTNOTNULL,FilePath NVARCHAR(MAX)NOTNULL,UploadTimeDATETIMEDEFAULTGETDATE(),IsEncryptedBITDEFAULT1,EncryptionType NVARCHAR(50)DEFAULT'SM4');-- 上传进度表(用于断点续传)CREATETABLEUploadProgress(SessionId NVARCHAR(255)PRIMARYKEY,FileName NVARCHAR(255)NOTNULL,FileMd5 NVARCHAR(255)NOTNULL,TotalChunksINTNOTNULL,UploadedChunksINTNOTNULL,LastUpdateTimeDATETIMEDEFAULTGETDATE());

给甲方爸爸的温馨Tips

  1. 关于IE8:真的不考虑升级一下吗?现在连微软都不支持IE8了…

  2. 关于20G文件:建议上传前先压缩,毕竟您家宽带上传20G可能需要一整天

  3. 关于100块预算:这个价格我们只能提供"心灵支持"服务了…

PS:那个QQ群真的存在,但红包可能已经被抢光了。至于"一个项目提成1万"…醒醒,该搬砖了!👷

设置框架

安装.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

创建数据库

配置数据库连接信息

检查数据库配置

访问页面进行测试


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

下载完整示例

下载完整示例

http://www.jsqmd.com/news/273348/

相关文章:

  • 信创环境下如何选择合适的大文件上传插件?
  • 信任链重构:当AI成为品牌与消费者之间的“信任中介”
  • WordPress开发者如何自定义Word导入的格式映射规则?
  • 政务站群如何配置WordPress实现PDF目录结构化提取?
  • 农业信息化平台如何通过WordPress处理Excel批量导入?
  • 2026年盘点比较好的税务风险管控专业公司,天津捷瑞通排第几? - 工业品牌热点
  • 智能制造MES系统如何调用WordPress的PPT转码接口?
  • 【大白专访09下】80万美金自营账户准备稳定出金时,平台却倒闭了
  • aepic.dll文件丢失找不到问题 免费下载方法分享
  • 2025年索具品牌口碑排行,链条索具优选来啦,钢卷吊具/吊装带/组装型索具/成套索具/吊具/环形吊带,索具生产商联系方式 - 品牌推荐师
  • 安可测评1月更新!鸿蒙系统入选!国产CPU、操作系统、数据库合集
  • AI智能办公鼠标服务哪家靠谱,南方网通鸿容鼠标是优选 - 工业品牌热点
  • R语言森林生态系统结构、功能与稳定性全流程分析——群落多样性、机器学习、SEM与时间序列建模
  • 用Keras轻量化部署医疗模型稳推理
  • 前后端分离架构,全功能社区论坛小程序商业运营源码系统
  • 示波器中电压有效值(Vrms)和峰峰值(Vpp)的关系
  • 为何需要“电压有效值”
  • 2026国内最新天然留香香精生产厂家top5推荐!广东广州优质品牌及厂商全面解析,助力日化香氛行业高效选品 - 品牌推荐2026
  • 深圳金鑫磁材|坡莫合金取电线圈:含钼5%第三代极端环境解决方案
  • linux systemd 不支持 /etc/profile?一个完整可运行的正确示例(从错误到正确)
  • 《把脉行业与技术趋势》-64-何为方向正确:方向是未来的目标,当种群生命的周期、国家宏观政策的生命周期、行业发展的生命周期、企业发展的周期、产品的发展生命周期、个人的职业操作周期,完全契合了,便是正确
  • 产业园推行数字孪生技术,这类技术落地后能否真正提升园区管理效率?
  • 新概念1英语语法个人总结
  • 深度学习科研代码和实验管理看懂开源项目每个文件解决常见的代码报错选择适合自己的方向
  • 告别嘈杂! Moodist 白噪音神器通过cpola把治愈音效装进袋
  • SpringBoot3-外部化配置与aop实现
  • 2026年浙江省汽车变速器连接器靠谱生产商有谁,青宸精密科技值得关注! - 工业品牌热点
  • 《灵魂躯壳》
  • springboot体育运动用品商城系统论坛商家
  • springboot药品商城系统三个角色