news 2026/2/16 9:48:05

C#如何实现大文件上传的日志记录?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C#如何实现大文件上传的日志记录?

大文件传输系统建设方案(ASP.NET技术栈)

一、项目背景与核心需求

作为公司项目负责人,针对产品部门提出的100G级大文件传输需求,需构建一套高兼容性、高稳定性、全浏览器支持的解决方案。核心需求如下:

  1. 功能需求

    • 单文件100G+传输,支持文件夹层级结构保留
    • 断点续传(浏览器刷新/关闭后进度不丢失)
    • 非打包下载(支持10万+文件并发下载)
    • 加密传输(SM4/AES可配置)与自动解密下载
  2. 技术栈兼容性

    • 后端:ASP.NET WebForm(现有系统) + .NET Core(新项目)
    • 前端:Vue2/Vue3/React(微前端集成)
    • 数据库:SQL Server(主)+ MySQL/Oracle(可配置)
    • 部署:阿里云ECS(内网/公网双模式)
  3. 商务约束

    • 年授权预算≤20万(不限项目数量)
    • 供应商需提供5个国企合作证明材料
二、技术架构设计
1.分层架构
┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ 浏览器端 │ │ 应用服务器 │ │ 存储层 │ │ (IE8/Vue2) │←──→│ (ASP.NET/.NET)│←──→│ (阿里云OSS) │ └───────────────┘ └───────────────┘ └───────────────┘ ↑ ↑ ↑ │ 分片传输组件 │ 加密控制模块 │ 对象存储适配器 │ │ 进度持久化 │ 算法切换服务 │ 多云存储路由 │ │ 文件夹解析器 │ 流量控制中间件 │ │
2.关键技术选型
  • 分片传输
    • 现代浏览器:Web Workers + Fetch API
    • IE8:XMLHttpRequest + Flash插件(通过Flex SDK编译)
  • 进度持久化
    • 现代浏览器:localStorage + IndexedDB
    • IE8:UserData对象(通过ActiveXObject)
  • 加密方案
    • 传输层:TLS 1.2 + SM4-CBC(国密SSL证书)
    • 存储层:AES-256-GCM(.NET System.Security.Cryptography)
三、核心功能实现
1.文件夹层级传输(非打包方案)

前端实现(Vue2兼容方案)

// 文件夹解析器(兼容IE8)classFolderParser{constructor(fileInputId){this.fileInput=document.getElementById(fileInputId);this.fileTree=[];}asyncparse(){if(window.File&&window.FileReader&&window.FileList&&window.Blob){// 现代浏览器APIconstfiles=this.fileInput.files;this.fileTree=this.buildModernTree(files);}else{// IE8兼容方案(通过Flash上传组件)this.fileTree=awaitthis.parseWithFlash();}returnthis.fileTree;}buildModernTree(files,path=''){consttree=[];for(leti=0;i<files.length;i++){constfile=files[i];constfullPath=path?`${path}/${file.webkitRelativePath}`:file.name;if(file.webkitRelativePath){// 处理文件夹结构constparts=file.webkitRelativePath.split('/');letcurrentLevel=tree;for(letj=0;j<parts.length-1;j++){constdirName=parts[j];letexistingDir=currentLevel.find(item=>item.type==='directory'&&item.name===dirName);if(!existingDir){existingDir={type:'directory',name:dirName,children:[]};currentLevel.push(existingDir);}currentLevel=existingDir.children;}currentLevel.push({type:'file',name:parts[parts.length-1],size:file.size,relativePath:file.webkitRelativePath});}else{tree.push({type:'file',name:file.name,size:file.size});}}returntree;}}

ASP.NET WebForm后端处理

// 文件分片接收接口(.NET Framework 4.8)[WebMethod]publicstaticstringUploadChunk(stringfileId,intchunkIndex,stringchunkData){stringtempPath=HttpContext.Current.Server.MapPath($"~/TempUploads/{fileId}");if(!Directory.Exists(tempPath)){Directory.CreateDirectory(tempPath);}// 解码Base64分片数据byte[]chunkBytes=Convert.FromBase64String(chunkData);// 保存分片到临时文件stringchunkPath=$"{tempPath}/chunk_{chunkIndex}.dat";File.WriteAllBytes(chunkPath,chunkBytes);// 更新Redis进度记录(使用StackExchange.Redis)IDatabaseredis=ConnectionMultiplexer.Connect("localhost").GetDatabase();redis.SetAdd($"upload:{fileId}",chunkIndex.ToString());returnJsonConvert.SerializeObject(new{status="success",receivedChunks=redis.SetLength($"upload:{fileId}")});}
2.断点续传持久化

IE8兼容方案

// ASP.NET处理IE8进度持久化[WebMethod]publicstaticstringSaveProgressIE8(stringfileId,stringprogressData){try{// 使用ASP.NET Session存储(需在web.config中配置sessionState模式为InProc)HttpContext.Current.Session[$"progress_{fileId}"]=progressData;// 降级方案:写入数据库(SQL Server)using(SqlConnectionconn=newSqlConnection(ConfigurationManager.ConnectionStrings["Default"].ConnectionString)){conn.Open();SqlCommandcmd=newSqlCommand("INSERT INTO UploadProgress (FileId, ProgressData, LastUpdate) "+"VALUES (@fileId, @progressData, GETDATE()) "+"ON DUPLICATE KEY UPDATE ProgressData=@progressData, LastUpdate=GETDATE()",conn);cmd.Parameters.AddWithValue("@fileId",fileId);cmd.Parameters.AddWithValue("@progressData",progressData);cmd.ExecuteNonQuery();}return"success";}catch(Exceptionex){return$"error:{ex.Message}";}}
3.加密传输与存储

.NET Core加密服务实现

// SM4加密服务(需引入BouncyCastle)publicclassSm4EncryptionService{privatereadonlybyte[]_key;publicSm4EncryptionService(byte[]key){_key=key??thrownewArgumentNullException(nameof(key));}publicbyte[]Encrypt(byte[]plaintext){varengine=newSM4Engine();varblockCipher=newCbcBlockCipher(engine);varparameters=newParametersWithIV(newKeyParameter(_key),newbyte[16]);// IVblockCipher.Init(true,parameters);byte[]output=newbyte[blockCipher.GetOutputSize(plaintext.Length)];intlength=blockCipher.ProcessBytes(plaintext,0,plaintext.Length,output,0);length+=blockCipher.DoFinal(output,length);Array.Resize(refoutput,length);returnoutput;}// 阿里云OSS上传前加密publicasyncTaskUploadToOssAsync(stringbucketName,stringobjectKey,FileStreamfileStream){varossClient=newOssClient("endpoint","accessKeyId","accessKeySecret");using(varmemoryStream=newMemoryStream()){awaitfileStream.CopyToAsync(memoryStream);byte[]encrypted=Encrypt(memoryStream.ToArray());varrequest=newPutObjectRequest(bucketName,objectKey,newMemoryStream(encrypted)){Metadata=newObjectMetadata{UserMetadata=newDictionary{["x-oss-meta-algorithm"]="SM4",["x-oss-meta-original-size"]=fileStream.Length.ToString()}}};ossClient.PutObject(request);}}}
四、兼容性保障方案
1.浏览器兼容矩阵
浏览器核心方案回退方案
IE8Flash+ActiveX控件纯HTTP分块上传
Chrome/FirefoxWeb Workers多线程Fetch API
360浏览器兼容模式检测强制使用Chrome内核
EdgeFetch API + Streams APIPolyfill
2.操作系统适配
  • Windows 7
    • 禁用TLS 1.3,强制使用TLS 1.2
    • 安装.NET Framework 4.8(通过Web安装程序)
  • Linux
    • 提供Mono运行时支持(针对ASP.NET WebForm)
    • 预装libgcrypt(SM4算法依赖)
五、供应商评估标准
  1. 资质要求

    • 提供5个国企项目合同(需包含金融/政府客户)
    • 阿里云技术认证合作伙伴资质
    • SM4算法商用密码产品认证
  2. 交付物清单

    • 完整C#源代码(含ASP.NET WebForm控件库)
    • IE8兼容性测试报告
    • 100G文件传输压力测试数据
六、项目实施计划
  1. POC验证阶段(2周)

    • 在阿里云ECS搭建测试环境
    • 完成IE8/CentOS/SQL Server兼容性验证
  2. 核心功能开发(4周)

    • 实现分片上传/下载基础框架
    • 完成SM4加密传输模块
  3. 兼容性适配阶段(3周)

    • 适配360浏览器/统信UOS
    • 通过等保2.0二级安全测评
七、风险控制
  1. IE8兼容风险

    • 预留10%预算用于采购第三方兼容性组件(如Telerik UI)
  2. 性能瓶颈风险

    • 在阿里云部署SLB负载均衡
    • 采用OSS多副本存储策略提升下载速度
八、商务谈判要点
  1. 授权模式

    • 要求按年授权(≤20万/年)
    • 明确授权范围(公司内部所有项目无限使用)
  2. 技术保障

    • 要求提供7×24小时技术支持
    • 约定SLA(故障响应时间≤2小时)

本方案通过模块化设计,可快速集成到公司20+现有项目中,预计降低60%以上重复开发成本。建议优先选择具有金融项目实施经验的供应商(如中科软、南天信息等),确保系统稳定性达到99.95%可用性要求。

设置框架

安装.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/2/15 23:30:14

基于java的SpringBoot/SSM+Vue+uniapp的少儿编程在线学习系统的详细设计和实现(源码+lw+部署文档+讲解等)

文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言 &#x1f31e;博主介绍&#xff1a;✌全网粉丝15W,CSDN特邀作者、211毕业、高级全…

作者头像 李华
网站建设 2026/2/16 7:21:49

安卓手机抓取崩溃日志的三种方式

安卓手机抓取崩溃日志的三种方式&#xff1a; 1.通过adb logcat 来获取&#xff1a; 使用场景&#xff1a;测试或者开发小伙伴 抓取。 先执行adb logcat -c 清理缓存日志 接着&#xff0c;抓取当前时间段开始的日志: adb logcat -v time >D:/crash.log 也可以抓取指定进程的…

作者头像 李华
网站建设 2026/2/7 19:39:06

稳定性增强、界面焕新:qData 数据中台开源版发布最新优化版本

在近期的更新中&#xff0c;我们将商业版用户反馈的关键修复与优化内容统一同步至开源版。此次更新覆盖系统稳定性、数据研发体验、资产管理、UI 表现等多个方面&#xff0c;大幅提升了整体使用体验。无论你来自社区还是企业侧&#xff0c;本次更新都将带来更顺畅、更可靠的数据…

作者头像 李华
网站建设 2026/2/12 0:12:30

16、深入了解psad:从高级功能到主动响应

深入了解psad:从高级功能到主动响应 1. 基于p0f签名的操作系统指纹识别 psad可以通过将SYN数据包中的TCP选项与p0f签名进行匹配,识别出正在探测iptables防火墙的特定远程操作系统。不过,这一功能需要使用 --log-tcp-options 参数才能实现。因此,在将默认的LOG规则添加到…

作者头像 李华
网站建设 2026/2/7 3:09:15

26、端口敲门与单包授权:网络安全认证技术对比

端口敲门与单包授权:网络安全认证技术对比 1. 端口敲门技术基础 端口敲门(Port Knocking)是一种增强网络服务安全性的技术,它通过特定的端口访问序列来临时重新配置数据包过滤器,从而允许特定IP地址访问受保护的服务。 1.1 自定义UDP校验和示例 通过执行以下脚本并使用…

作者头像 李华
网站建设 2026/2/6 4:49:27

NumPy 实用文档

NumPy 实用文档 文章目录NumPy 实用文档一、Numpy基础操作1. 数组创建&#xff08;Array Creation&#xff09;2. 随机数生成&#xff08;Random&#xff09;3. 数组形状操作&#xff08;Shape Manipulation&#xff09;4. 数组连接&#xff08;Concatenate & Stack&#x…

作者头像 李华