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

汽车制造企业如何用ASP.NET实现文件夹上传?

开发日记:大文件上传系统攻坚记
日期: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

创建数据库

配置数据库连接信息

检查数据库配置

访问页面进行测试


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

效果预览

文件上传

文件刷新续传

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

文件夹上传

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

批量下载

支持文件批量下载

下载续传

文件下载支持离线保存进度信息,刷新页面,关闭页面,重启系统均不会丢失进度信息。

文件夹下载

支持下载文件夹,并保留层级结构,不打包,不占用服务器资源。

下载示例

下载完整示例

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

相关文章:

  • 【高企日报】谁需要《高企管理成熟度认证》?——一张图看清你的位置
  • 工程建筑领域ASP.NET应用如何分享文件夹上传方案?
  • 当AI生图突破速度边界:Nano Banana2+ChatPPT如何重塑视觉生产
  • PHP后端如何配合WebUploader实现超大附件秒传与断点续传?
  • 应对专利无效、权属纠纷,企业如何守住核心技术产权?
  • 芯片制造中,C#如何处理文件夹上传的加密需求?
  • 2026年目前有名的抖音广告代运营企业口碑推荐榜,抖音广告代运营/信息流广告代运营,抖音广告代运营公司推荐排行榜 - 品牌推荐师
  • 青岛口碑不错的隐形车衣专业公司费用怎么算 - mypinpai
  • 露,集成化信息化信号采集处理系统 一体化生物医学信号采集系统 机能集成化信号采集与处理系统
  • LeetCode1680:连接连续二进制数字
  • 以太网接口设备写静态路由的时候为什么写下一跳ip地址?而不是出接口。(ensp模拟说明)
  • 上海宠物口腔健康守护者:2026年优质医生推荐,狗口腔溃疡诊疗/狗狗牙结石/猫咪口腔护理/猫咪口炎,宠物口腔医生哪个靠谱 - 品牌推荐师
  • 哈尔滨沃尔沃XC90俄罗斯STP汽车隔音降噪 有效解决胎噪、风噪、发动机噪音 哈尔滨最专业汽车隔音店-博士达汽车音响倾心打造
  • 科研党收藏!降AI率平台 千笔·降AIGC助手 VS Checkjie,专为本科生定制
  • Snowflake收购数据库迁移技术初创公司Datometry
  • 闭眼入!8个AI论文网站深度测评:继续教育毕业论文写作必备工具推荐
  • 交稿前一晚!降AIGC平台 千笔·专业降AI率智能体 VS WPS AI,继续教育必备神器
  • 别再瞎找了!AI论文平台 千笔ai写作 VS 灵感ai,自考写论文就选它!
  • 6.4 企业数据分析师Agent:数据查询与报告生成实战
  • 6.3 智能客服系统端到端开发:对话管理加RAG加人工转接
  • 什么时候该用接口,什么时候该用抽象类,应该怎么组合才好用,才高级
  • 2026年2月实木家具实力厂家推荐榜,匠心工艺实测解析 - 品牌鉴赏师
  • 大模型不是你家熊孩子:聊聊生成式模型“去偏 / 去毒”流水线怎么落地
  • 想选专业的家装装修设计公司,上海朗域装饰的口碑咋样 - mypinpai
  • 2026年2月木工机械设备供应厂家推荐,资质案例售后深度解读 - 品牌鉴赏师
  • 大二寒假实习小结(嵌入式软件开发岗)
  • 别小看一个“偷看”:Peeking Iterator 背后的设计哲学
  • 001 nvm 管理不同版本的 node 与 npm
  • 枚举是实现接口,匿名内部类扩展function实现
  • 藏家必看!北京上门回收老书3家靠谱机构盘点 避坑科普一次说清 - 品牌排行榜单