http上传文件深度解析-高性能http传输

基于multipart/form-data的文件上传机制深度解析与Java实战 随着微服务和云原生普及,本地存储已不能满足需求。为此,抽象出统一的存储适配层:key表示唯一对象键(如所有方法抛出便于统一错误处理。 阅读详情
    最近在做web服务器的时候将一些应用集成在了服务器里面,比如说文件上传,结果调试用了一个星期的时间,搞得自己头昏脑涨,现在总于解决了,现将注意细节叙述如下:
   http上传协议很简单,用post协议,协议头部包含Content-Length项,这是一次上传的所有body部分长度总和,包括多文件之间的分割等等,所以也就难怪了,http上传要比ftp等慢,其实慢就慢在body解析上,下面对于文件分割作一些阐述。
一个典型的http上传协议头类似于这样:

   POST /public/upload.action HTTP/1.1
     ost: maiit.com:8088
     User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b5) Gecko/2008041514                  Firefox/3.0b5
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: en-us,en;q=0.5
    ccept-Encoding: gzip,deflate
    ccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Connection: keep-alive
    Referer: http://maiit.com:8088/public/up.html
    Content-Type: multipart/form-data;      boundary=---------------------------88739631214394723612117964652
    Content-Length: 3433
其中,boundary是文件分割符号,每个文件以如下字段开头
      
     -----------------------------88739631214394723612117964652
     Content-Disposition: form-data; name="file"; filename="hashtables.h"
     Content-Type: text/x-chdr
以如下字段结尾:
      
     -----------------------------88739631214394723612117964652
    Content-Disposition: form-data; name="uploadButton"

    up
    -----------------------------88739631214394723612117964652--

其中并没有包含单个文件的长度,这就是对于传输大文件性能不高的关键所在,因为应用服务器必须对每次的数据进行比对,查找文件分割符号,加入传输一个100M的文件,服务器端cpu必须对这100M的文件每一个字节进行字符串比对,那么有没有解决办法呢?
     web服务器一般只将请求的数据直接转发给应用层,不做任何处理(除了HTTP协议头),假设你可以直接控制web服务器,类似于我现在的状况,就有了解决办法,比如我的服务器模型是epoll事件驱动,通过分析发现,对于flash等上传途径flash已经做了优化,数据并不是一股脑地发送过来,而是先发送协议头部,然后发送一个文件分割符部分数据,在然后才是正文,正文最后一个数据包不管是否等于socketBuffer,结尾标识有可能会下次发送,这样一个过程就给了我们一个解决途径,几乎不用分析(除了文件名称)任何一个文件数据包就能完成地保存下来文件,因为数据是分段发送的,并没有粘滞在一起,通过比对发送次数就可以确定,http协议头的第一个数据包肯定是单独发送的,然后才会转向文件处理程序,然后接收第2个数据包,并且flash上传文件不管是多文件还是单文件其实都是按照单个文件分次上传的,这样传送过程就可控了。
   注意上面的“有可能”几个字,这几天困扰我的也在于此,flash并不是想象中的稳定的,不同版本之间是不一样的,linux上和windows上的解析也是不一样的,这样就不能给我们一个统一的解决途径,我也是在测试中才发现这样的问题的,不仅仅如此,flash的很多特性as3和as2根本不兼容,一个不向下兼容的软件这样流行真是让人费解,并且上述的解决途径不不适合传送的页面http上传,页面上传基本上就是直接混合在一起的,所以这个最高效的解决途径看来要放弃了,几天的测试改进发现还还是有解决办法的,于是就有了下面的处理模式。
   既然对于没个文件都是有一个开头标识和结尾标识,那不防在这上面做作文章,如果能只分析开头和结尾而不分析中间数据,那么对于大型文件http传送将是一件幸事,开头倒是好分析,对没个数据包分析知道有文件开头为止,问题就在于结尾,不知道文件长度的情况下你怎么知道何时分析一个数据包是否包含结尾?幸好有这样一个共同特性,对于单个文件传送,最后一个包含结尾的数据包在总length传送=0的时候总是完整地发送地(不会有一部分放在前一个socket交互另一个放在后一个,估计这是浏览器在发送没个文件的时候后面不会主动将文本附加在最后一个数据包),所以当总length小于SocketBuffer得时候就是分析文件结尾的时候,这样我们最总最多分析2次开头,2次结尾,我在缓存设为16K的时候局域网就可以达到3M的上传速度,最大64k缓存(刚好等于socket最大缓存)的时候能大到9M/秒的上传速度,几乎等于UDP的速度,对于大型文件的优势可想而知。

    这里依然存在的问题是之支持flash多文件上传和http单文件上传,当然,如果你是一个视频上传等程序这足够用了,这里抛砖引玉,望高手共同探讨
加快HTTP上传速度 加快HTTP上传速度,提高上传速度,为你节省宝贵时间 立即下载

相关推荐

Http文件上传下载(含进度条,下载上传速度)

C# WinForm Http上传下载(含进度条,下载上传速度) C# WinForm Http上传下载(含进度条,下载上传速度)

HTTP协议传输数据,大小有上限吗?

“post 理论上讲是没有大小限制的,HTTP协议规范也没有进行大小限制,但实际上post所能传递的数据量大小取决于服务器的设置和内存大小” 摘自:http://www.phpernote.com/php-string/895.html

2万+

《软件工程——实践者的研究方法》重难点复习笔记(第八章——理解需求)

8项需求工程任务 inception 开始 8.1.1 identify stakeholders 定义:从软件开发中收益 例如:市场人员、销售经理、顾客、顾问、维护团队等(P139) 8.1.2 这个阶段的问题是context-free的。有三套(P140) 8.1.3 提到NFR(nonfunctional requirement)和QFD(quality

whooiif的博客 1815

记录一次优化大数据量http传输慢的问题

场景是标记百度地图的坐标点,数据库返回的坐标点有26万数据,传输速度在11秒左右。 解决方式:http用gzip压缩后返回,最后返回给前端的数据还是原数据,无需前端再处理 编程语言:go,使用的是gin框架 import "github.com/gin-contrib/gzip" func main() { r := gin.Default() r.Use(gzip.Gzip(gzip.DefaultCompression)) r.GET("/ping", fu...

qq_38384460的博客 4621

Linux 命令之 localectl -- 控制系统的本地化与键盘布局

文章目录命令介绍常用选项参考示例(一)显示当前的本地化设置与键盘映射(二)设置系统的本地化字符集环境变量(三)列出本地所有字符集(四)列出所有可用的控制台键盘映射(五)设置控制台的键盘映射 命令介绍 localectl 命令可用于查询与修改系统的本地化(locale)与键盘布局的设置。 它通过与 systemd-localed.service 通信来修改例如 /etc/locale.conf 与 /etc/vconsole.conf 之类的配置文件。本地化设置控制着 用户界面的语言、字符类型与字符编码、 日

liaowenxiong的博客 5396

Rust 与 Golang 深度对决:从语法到应用场景的全方位解析

Rust 定义函数以fn关键字开头,参数需明确指定类型,返回值类型紧跟在箭头->之后。// 定义函数add,接收两个i32类型参数a和b,返回i32类型结果,功能为两数相加a + bRust 和 Golang 各有千秋,在不同领域展现独特优势。Rust 凭借强大的内存安全与高性能,在系统编程、网络编程以及对内存安全和性能要求高的场景中表现突出;Golang 则以简洁语法和出色并发性能,在云计算、分布式系统、Web 开发等领域占据一席之地。

muyouking 1770

持续HTTP链接和非持续HTTP链接传送文件的时间

例题:1. (4分)假设在客户端浏览器中通过点击某个超链接获得另一个Web页面。如果客户端只知道Web页面所在服务器的名字,但不知道该服务器的IP地址。因此,客户端必须使用DNS查询服务器的IP地址。假设,客户端使用DNS获得Web服务器的IP地址共耗时tdns。进一步假定,该Web页面共有10个非常小的对象。令RTT0表示客户端和Web服务器间数据传输的RTT值, HTML文档及内嵌对象的传输时...

wbwang1998的博客 2万+

无人机测绘航线生成算法

JavaScript开发和测试无人机测绘航线的自动生成方法,设计可行,算法可靠

ly1302116的专栏 5235

突破大文件传输瓶颈:http-parser分块上传技术深度解析

还在为HTTP大文件传输的效率和内存占用问题困扰吗?http-parser作为高性能的C语言HTTP消息解析器,其分块传输编码(Chunked Transfer Encoding)实现为你提供了完美的解决方案! ## 🔥 读完本文你将获得 - 理解HTTP分块传输编码的工作原理 - 掌握http-parser中chunked解析的实现机制 - 学会在项目中高效处理大文件传输 - 了解分块

gitblog_00992的博客 922

livox雷达斜装修改

指的是,使用外部的陀螺仪的话,雷达到外部陀螺仪的转换,而mid360的陀螺仪是内置在360里面的,且方向和点云方向是一致的,所以不能通过修改此处去改变陀螺仪方向。同时livox_ros_driver2中的MID360_config.json里面的。这里面的外参,只能改变点云相对陀螺仪的位姿,而不能将陀螺仪映射到你期望的倾斜角度。fast_lio中的mid360.yaml中的外参。

z1872385的博客 2710

图解ADAS电源系统架构:看懂这张图,搞懂前装摄像头的供电秘密!

别以为ADAS系统就是“摄像头 + SoC”,其实最难搞的是供电系统,尤其是要满足车规级ASIL-D安全等级时。供电时序、电压稳定性、电源监控、冗余通信链路,一个都不能少。😤一旦电源选型不对,轻则系统卡顿,重则全车失控,不是闹着玩的。

weixin_43199439的博客 674

Meteor-Files深度解析:DDP与HTTP传输协议的终极对比指南

在 Meteor.js 生态系统中,文件上传是一个常见的需求,而 **Meteor-Files** 作为最受欢迎的文件管理包,提供了两种核心传输协议:DDP 和 HTTP。本文将深入解析这两种协议的优缺点,帮助开发者做出明智的技术选择。无论您是构建实时协作应用还是需要高性能文件上传功能,了解这些传输协议的差异至关重要。🚀 ## 📊 传输协议概览:DDP vs HTTP Meteor-Fil

gitblog_00978的博客 1067

手把手教你学Simulink--逆变器场景:基于Simulink的单相全桥逆变器PWM控制仿真建模

本文介绍了使用Simulink和Simscape Electrical库进行单相全桥逆变器PWM控制仿真建模的详细步骤。主要内容包括:从创建Simulink项目、添加电力电子组件、构建逆变器模型,到设置参数、运行仿真和结果分析。重点讲解了逆变器核心模块的配置、PWM信号生成、负载建模等关键环节,并提供了优化改进建议。该指南适用于电力电子初学者,通过仿真可以帮助理解单相全桥逆变器的工作原理和PWM控制技术,为实际应用和算法开发提供基础平台。

MHD0815的博客 666

QuickShare深度解析:Go+React打造的高性能文件共享利器,如何实现秒级文件传输?

你是否曾为在设备间传输大文件而烦恼?无论是工作文档、设计稿还是家庭照片,传统的邮件附件、云盘同步总是让人等得心急如焚。今天,我要为你介绍一个能够彻底改变文件共享体验的开源神器——QuickShare!🚀 QuickShare是一个基于Go语言后端和React+TypeScript前端的现代化文件共享工具,它不仅支持断点续传、多用户管理,还能让你在局域网内实现秒级文件传输。最令人惊喜的是,它完全

gitblog_00108的博客 538

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ContiNew Admin文件上传功能深度优化:大文件分片上传与存储策略全解析

ContiNew Admin作为一款基于Spring Boot3和Vue3的前后端分离中后台管理框架,在文件上传功能上进行了深度优化,特别针对大文件传输场景提供了高效可靠的分片上传解决方案。本文将全面解析其大文件分片上传实现原理与多场景存储策略,帮助开发者快速掌握企业级文件上传功能的设计与优化技巧。 ## 大文件上传的核心挑战与解决方案 在企业级应用中,大文件上传面临着网络不稳定、上传中断、服

gitblog_00060的博客 507

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

终极解决Alist大文件传输卡顿:3种高性能优化方案深度解析

你是否在使用Alist传输大文件时遭遇传输中断、速度波动或内存占用过高的问题?作为一款功能强大的文件列表程序,Alist在处理大文件传输时面临诸多挑战。本文将深入剖析Alist的流处理机制,提供从配置优化到源码改造的完整解决方案,帮助你在网络存储环境中实现流畅稳定的大文件传输体验。 ## 问题根源:大文件传输为何如此困难? 大文件传输在Alist中的核心挑战源于内存限制和流处理架构的固有特性。

gitblog_00639的博客 390

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

突破抓包性能瓶颈:ProxyPin大文件传输吞吐量深度测评

你是否经历过这样的场景:使用抓包工具调试API时一切正常,但传输几GB的安装包或视频文件时,不仅抓包界面卡顿,连网络速度也骤降50%以上?这是因为传统抓包工具在处理大文件传输时,普遍存在内存溢出、缓冲区阻塞和协议解析效率低下等问题。 ProxyPin作为基于Flutter开发的全平台抓包工具(支持Windows、Mac、Android、iOS、Linux),在设计之初就将高性能作为核心目标。本文

gitblog_00529的博客 1019

C++文件上传下载终极指南:Crow框架实现断点续传与进度显示

在当今数字化时代,文件传输已成为Web应用不可或缺的核心功能。Crow框架作为C++生态中高性能的RESTful API框架,为开发者提供了强大的文件上传下载支持。通过[Crow框架](https://link.gitcode.com/i/e1b262e4660f9d98f6db214829eecdaf),您可以轻松构建支持大文件传输、断点续传和实时进度显示的企业级应用。🚀 ## 📁 Cro

gitblog_00907的博客 858

如何搭建高性能Telegram文件直链流式传输机器人

你是否曾经遇到过这种情况:在Telegram上收到一个大型视频文件,想要分享给朋友却需要等待漫长的下载过程?或者想要在线预览文档却受限于Telegram的播放器限制?今天我要介绍的TG-FileStreamBot正是为解决这些问题而生的Go语言解决方案。 TG-FileStreamBot是一个基于Go语言开发的高性能Telegram机器人,它能够为Telegram上的文件生成即时可用的直接下载链

gitblog_00093的博客 458

RustFS存储协议深度解析:HTTP/2与gRPC高性能通信架构

在分布式对象存储领域,协议选择直接决定系统性能上限。传统基于HTTP/1.1的存储系统面临三大瓶颈:**队头阻塞**导致并发请求处理效率低下、**文本协议开销**浪费带宽资源、**连接复用不足**增加服务端压力。RustFS作为新一代高性能存储系统,通过双协议栈设计彻底解决这些问题——采用HTTP/2实现低延迟数据传输,结合gRPC提供强类型的服务间通信,构建起吞吐量达10GB/s级别的存储网络。...

gitblog_00548的博客 1206
上一篇: DNS数据包
下一篇: 【09.03.24】在Ubuntu中和Android中添加开机自启动的守护进程
xbin1981
博客等级 码龄14年 8粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值