news 2026/4/18 11:25:25

航空航天领域如何实现大文件秒传的解决方案总结?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
航空航天领域如何实现大文件秒传的解决方案总结?

最近做在做ePartner项目,涉及到文件上传的问题。 以前也做过文件上传,但都是些小文件,不超过2M。 这次要求上传100M以上的东西。 没办法找来资料研究了一下。基于WEB的文件上传可以使用FTP和HTTP两种协议,用FTP的话虽然传输稳定,但安全性是个严重的问题,而且FTP服务器读用户库获取权限,这样对于用户使用来说还是不太方便。 剩下只有HTTP。在HTTP中有3种方式,PUT、WEBDAV、RFC1867,前2种方法不适合大文件上传,目前我们使用的web上传都是基于RFC1867标准的HTML中基于表单的文件上传。

协议

一、先简要介绍一下RFC1867(Form-based File Upload in HTML)标准:
1.带有文件提交功能的HTML表单
现有的HTML规范为INPUT元素的TYPE属性定义了八种可能的值,分别是:CHECKBOX, HIDDEN, IMAGE, PASSWORD, RADIO, RESET, SUBMIT, TEXT. 另外,当表单采用POST方式的时候,表单默认的具有"application/x-www -form-urlencoded" 的ENCTYPE属性。
RFC1867标准对HTML做出了两处修改:
1)为INPUT元素的TYPE属性增加了一个FILE选项。
2)INPUT标记可以具有ACCEPT属性,该属性能够指定可被上传的文件类型或文件格式列表。
另外,本标准还定义了一种新的MIME类型:multipart/form-data,以及当处理一个带有ENCTYPE=“multipart/form-data” 并且/或含有的标记的表单时所应该采取的行为。
举例来说,当HTML表单作者想让用户能够上传一个或更多的文件时,他可以这么写:

File to process:

HTML DTD里所需要做出的改动是为InputType实体增加一个选项。此外,我们也建议用一系列用逗号分隔的文件类型来作为INPUT标记的ACCEPT属性。

... (其他元素) ...<!ENTITY%InputType"(TEXT|PASSWORD|CHECKBOX|RADIO|SUBMIT|RESET|IMAGE|HIDDEN|FILE)"><!ELEMENTINPUT-0EMPTY><!ATTLISTINPUTTYPE%InputTypeTEXTNAMECDATA#IMPLIED--requiredforallbutsubmitandresetVALUECDATA#IMPLIEDSRC%URI#IMPLIED--forimageinputs--CHECKED(CHECKED)#IMPLIEDSIZECDATA#IMPLIED--likeNUMBERS,butdelimitedwithcomma,notspaceMAXLENGTHNUMBER#IMPLIEDALIGN(top|middle|bottom)#IMPLIEDACCEPTCDATA#IMPLIED--listofcontenttypes>... (其他元素) ...

文件传输延迟

在某些情况下,在确实准备接受数据前,服务器先对表单数据中的某些元素(比如说用户名,账号等)进行验证是推荐的做法。但是,经过一定的考虑后,我们认为如果服务器想这样做的话,最好是采用一系列的表单,并将前面所验证过的数据元素作为“隐藏”字段传回给客户端,或者是通过安排表单使那些需要验证的元素先显示出来。这样的话,那些需要做复杂的应用的服务器可以自己维持事务处理的状态,而那些简单的应用的则可以实现得简单些。
HTTP 协议可能需要知道整个事务处理中的内容总长度。即使没有明确要求,HTTP客户端也应该提供上传的所有文件的内容总长度,这样一个繁忙的服务器就能够判断文件的内容是否是过大以至于将不能完整地处理,从而返回一个错误代码并关闭该连接,而不用等到接受了所有的数据才进行判断。目前一些现有的CGI应用对所有的POST事务都需要知道内容总长度。
如果INPUT标记含有一个MAXLENGTH属性,客户端可以将这个属性值看作是服务器端所能够接受的传送文件的最大字节数。在这种情况下,服务器能够在上传开始前,提示客户端在服务器上有多少空间可以用来进行文件上传。但是应该引起注意的是,这仅仅是一个提示,在表单被创建后和文件上传前,服务器的实际需求可能会发生改变。
在任何情况下,如果接受的文件过大的话,任何一个HTTP服务器都有可能在文件传输的过程中中断传输。
3.传输二进制数据的其他解决办法
有些人曾经建议使用一种新的MIME类型"aggregate",比如说aggregate/mixed 或是content-transfer- encoding “包"来描述那些不确定长度的二进制数据,而不是靠分解为多个部分来表示。虽然我们并不反对这么做,但这需要增加额外的设计和标准化工作来让大家接受并理解"aggregate”。 从另一方面来说,"分解为多部分"的机制工作得很好,能够非常简单的在客户发送端和服务器接受端加以实现,而且能像其他一些综合处理二进制数据的方式一样高效率地工作。
4.例子
假设服务器段提供的是如下的HTML:

What is your name? What files are you sending?

用户在“姓名”字段里面填写"Joe Blow",对问题"What files are you sending?“,用户选择
了一个文本文件"file1.txt”。
客户段可能发送回如下的数据:

Content-type: multipart/form-data, boundary=AaB03x --AaB03x content-disposition: form-data; name="field1" Joe Blow --AaB03x content-disposition: form-data; name="pics"; filename="file1.txt" Content-Type: text/plain ... file1.txt 的内容... --AaB03x--

如果用户同时还选择了另一个图片文件"file2.gif",那么客户端可能发送的数据将是:

Content-type: multipart/form-data, boundary=AaB03x --AaB03x content-disposition: form-data; name="field1" Joe Blow --AaB03x content-disposition: form-data; name="pics" Content-type: multipart/mixed, boundary=BbC04y --BbC04y Content-disposition: attachment; filename="file1.txt" Content-Type: text/plain ... file1.txt 的内容... --BbC04y Content-disposition: attachment; filename="file2.gif" Content-type: image/gif Content-Transfer-Encoding: binary ... file2.gif的内容... --BbC04y-- --AaB03x--

利用RFC1867标准处理文件上传的两种方式:

1.一次性得到上传的数据,然后分析处理。
看了N多代码之后发现,目前无组件程序和一些COM组件都是使用Request.BinaryRead方法。一次性得到上传的数据,然后分析处理。这就是为什么上传大文件很慢的原因了,IIS超时不说,就算几百M文件上去了,分析处理也得一阵子。
2.一边接收文件,一边写硬盘。
了解了一下国外的商业组件,比较流行的有Power-Web,AspUpload,ActiveFile,ABCUpload, aspSmartUpload,SA-FileUp。其中比较优秀的是ASPUPLOAD和SA-FILE,他们号称可以处理2G的文件(SA- FILE EE版甚至没有文件大小的限制),而且效率也是非常棒,难道编程语言的效率差这么多?查了一些资料,觉得他们都是直接操作文件流。这样就不受文件大小的制约。但老外的东西也不是绝对完美,ASPUPLOAD处理大文件后,内存占用情况惊人。1G左右都是稀松平常。至于SA-FILE虽然是好东西但是破解难寻。然后发现2款.NET上传组件,Lion.Web.UpLoadModule和AspnetUpload也是操作文件流。但是上传速度和 CPU占用率都不如老外的商业组件。
做了个测试,LAN内传1G的文件。ASPUPLOAD上传速度平均是4.4M/s,CPU占用10 -15,内存占用700M。SA-FILE也差不多这样。而AspnetUpload最快也只有1.5M/s,平均是700K/s,CPU占用15- 39,测试环境: PIII800,256M内存,100M LAN。我想AspnetUpload速度慢是可能因为一边接收文件,一边写硬盘。资源占用低的代价就是降低传输速度。但也不得不佩服老外的程序,CPU占用如此之低…
三、ASP.NET上传文件遇到的问题
我们在用ASP.NET上传大文件时都遇到过这样或那样的问题。设置很大的maxRequestLength值并不能完全解决问题,因为ASP.NET会 block直到把整个文件载入内存后,再加以处理。实际上,如果文件很大的话,我们经常会见到Internet Explorer显示 “The page cannot be displayed - Cannot find server or DNS Error”,好像是怎么也 catch不了这个错误。为什么?因为这是个client side错误,server side端的Application_Error是处理不到的。
四、ASP.NET大文件上传解决方案
解决的方法是利用隐含的HttpWorkerRequest,用它的GetPreloadedEntityBody 和 ReadEntityBody方法从IIS为ASP.NET建立的pipe里分块读取数据。Chris Hynes为我们提供了这样的一个方案(用HttpModule),该方案除了允许你上传大文件外,还能实时显示上传进度。

Lion.Web.UpLoadModule和AspnetUpload

两个.NET组件都是利用的这个方案。
方案原理:
利用HttpHandler实现了类似于ISAPI Extention的功能,处理请求(Request)的信息和发送响应(Response)。
方案要点:
1. httpHandler or HttpModule
a. 在asp.net进程处理request请求之前截获request对象
b. 分块读取和写入数据
c. 实时跟踪上传进度更新meta信息
2. 利用隐含的HttpWorkerRequest用它的GetPreloadedEntityBody 和 ReadEntityBody方法处理文件流

IServiceProviderprovider=(IServiceProvider) HttpContext.Current;HttpWorkerRequestwr=(HttpWorkerRequest) provider.GetService(typeof(HttpWorkerRequest));byte[]bs=wr.GetPreloadedEntityBody();....if(!wr.IsEntireEntityBodyIsPreloaded()){intn=1024;byte[]bs2=newbyte[n];while(wr.ReadEntityBody(bs2,n)>0{.....}}

3. 自定义Multipart MIME 解析器
自动截获MIME分割符
将文件分块写如临时文件
实时更新Appliaction 状态(ReceivingData, Error, Complete)

完整示例

点击下载完整示例

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 3:37:54

导师又让重写?千笔AI,继续教育论文写作神器

你是否曾在论文写作中感到力不从心&#xff1f;选题无从下手、框架混乱、文献资料繁杂、查重率高得让人焦虑&#xff0c;甚至格式错误都可能让整篇论文功亏一篑。对于继续教育的学生来说&#xff0c;论文不仅是学业的终点&#xff0c;更是能力的考验。面对这些挑战&#xff0c;…

作者头像 李华
网站建设 2026/4/18 3:37:59

java+vue基于springboot的攻防靶场实验室平台的设计与实现_xd0oo5dg

目录基于SpringBoot和Vue的攻防靶场实验室平台设计与实现核心功能模块系统特色设计开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;基于SpringBoot和Vue的攻防靶场实验室平台设计与实现 该平台结合SpringBoot后端框架与Vue前端…

作者头像 李华
网站建设 2026/4/18 3:38:12

摆脱论文困扰!千笔·降AIGC助手,继续教育降重首选

在AI技术迅速发展的今天&#xff0c;越来越多的学生和研究人员开始依赖AI工具进行论文写作与内容生成。然而&#xff0c;随着学术审查标准的不断提高&#xff0c;AI生成内容的识别能力也在不断增强&#xff0c;许多学生因此面临“AI率超标”和“重复率过高”的双重压力。如何在…

作者头像 李华
网站建设 2026/4/18 3:38:02

价值两万美元的复制粘贴错误:HackerOne如何意外“黑”了自己

价值两万美元的复制粘贴错误&#xff1a;HackerOne如何意外“黑”了自己 让我来讲述我所研究过的最具讽刺意味的安全事件之一——全球领先的漏洞赏金平台HackerOne&#xff0c;因一次简单的复制粘贴错误&#xff0c;意外地将自己王国的钥匙拱手相让。 当时我正在查阅已披露的…

作者头像 李华
网站建设 2026/4/18 3:37:59

干货来了:圈粉无数的降AIGC平台 —— 千笔·专业降AIGC智能体

在AI技术迅猛发展的今天&#xff0c;越来越多的学生开始借助AI工具辅助论文写作&#xff0c;以提升效率和质量。然而&#xff0c;随之而来的AI率超标问题却让许多学生陷入困境——随着查重系统对AI生成内容的识别能力不断提升&#xff0c;论文中若存在明显AI痕迹&#xff0c;不…

作者头像 李华
网站建设 2026/4/8 13:58:49

Ollama微调保姆级教程:零复杂部署,普通人也能搞定专属AI模型?

一、不用大厂服务器,家用GPU也能微调AI?真相藏不住了 AI圈最近炸了个大消息——Ollama微调彻底“平民化”了!以前动辄需要几十万服务器、资深算法工程师才能搞定的模型定制,现在只要懂点基础Python,有一块普通GPU,就能自己动手做,甚至能直接部署到本地,离线就能用。 …

作者头像 李华