HTTP传输大文件

http上传文件 http协议是建立在tcp、ip协议的应用层规范。 http协议规范把http请求分为3个部分:状态行,请求头,请求体。所有的方法、实现都是围绕 “如何运用和组织这三部分” 来完成的。了解http请求的组成部分后,就可以应变任何实际工作中所遇到的需求和问题了。 http里没有专门用于文件上传的请求方式,文件上传请求是在post请求基础之上定义出来的一种方式。 Content-Type在发送到服务器时候内容编码方式,它有如下的三个值。 ①application/x-www-form-urlen... 阅读详情

一 概述

        早期网络传输的文件非常小,只是一些几K大小的文本和图片,随着网络技术的发展,传输的不仅有几M的图片,还有可以达到几G和几十G的视频。

        在这些大文件传输的情况下,100M的光纤或者4G移动网络都会因为网络压力导致在上传或者下载的情况下导致网络传输链路挤的“满满当当”。

二 网络中大文件传输之数据压缩

        通常浏览器在发送请求时都会带上"Accept-Encoding"头字段,该字段用来声明浏览器支持的压缩格式列表,例如gzip,deflate,br等,这样服务器就可以从中选择一种压缩算法,并将其放进"Content-Encoding"响应头中,最后将元数据压缩后发给浏览器。

        这种情况下下,如果压缩率是50%,也就是100K数据可以变成50K大小的文件进行传输,从网络的角度考虑,就类似于网络提升了一倍。

        这种方法的缺点是,gzip等压缩算法通常只是对文本文件有较好的压缩率,而图片,音频,视频的多媒体文件由于本身已经是高度压缩的,此时再使用gzip处理不会变小(甚至还有可能会增大一点),所以这种方法就不适用了。

        由于这种方法对文本类型的数据压缩效果比较好,所以大部分网站会使用该技术作为"保底"。例如,Nginx里就会使用"gzip on"指令,启用对"text/html"的压缩。

三 网络中大文件传输之数据分块传输

        相对于数据压缩那种将大文件整体变小来说,数据分块传输可以保证在大文件无法因压缩处理变小的时候,可以将其拆解,分成多个小块,然后将这些小块批发给浏览器,浏览器收到后会对拆解后的文件再进行组装复原。

        这样的好处是,在浏览器的和服务器的内存中都不会再内存中保存文件的全部,每次只是发送一小部分,从而网络不会被大文件占用,内存,宽带等资源就会被节省。

        这种"化整为零"的思路在HTTP协议里就是通过"chunked"分块传输编码,在响应报文里用头字段"Tranfer-Encoding:chunked"来表示,意思就是报文中的body部分不是一次性发送过来,而是分成许多块的"chunk"并进行逐个发送。

        分块传输也可以用于"流式数据",例如由数据库动态生成的表单页面,这种情况下body数据的长度是未知的,无法在头字段"Content-Length"里给出确切的长度,所以只能通过chunked方式分块发送。

        "Tranfer-Encodeing:chunked"和"Content-Length"这两个字段是互斥的,也就是说响应报文中的两个字段是不可以同时出现的,一个响应报文的传输长度要么已经知道了,要么是未知的(chunked)。

四 分块传输的编码规则

        分块传输的编码规则类似于响应头,同样采用了明文的方式。

  • 每个分块包含两部分,长度头和数据块。
  • 长度头是以CRLF(回车换行,即\r\n)结尾的一行明文,用16进制数字表示长度。
  • 数据块紧跟其后,最后同样使用CRLF结尾,但数据不包含CRLF。
  • 最后用一个长度为0的块(即最后的空行)来表示结束,即"0\r\n\r\n"。

        图示:

 注意:浏览器在收到分块传输的数据之后会自动按照规则去掉分块编码,重新组装出内容。

五 大文件传输之范围请求

        有了分块传输编码,服务器就可以轻松地收发大文件了,但对于上 G 的超大文件,还有一些问题需要考虑。

        比如,你在看当下正热播的某穿越剧,想跳过片头,直接看正片,或者有段剧情很无聊,想拖动进度条快进几分钟,这实际上是想获取一个大文件其中的片段数据,而分块传输并没有这个能力。

        HTTP 协议为了满足这样的需求,提出了“范围请求”(range requests)的概念,允许客户端在请求头里使用专用字段来表示只获取文件的一部分,相当于是客户端的“化整为零”。

        范围请求不是 Web 服务器必备的功能,可以实现也可以不实现,所以服务器必须在响应头里使用字段“Accept-Ranges: bytes”明确告知客户端:“我是支持范围请求的”。

        如果不支持的话该怎么办呢?服务器可以发送“Accept-Ranges: none”,或者干脆不发送“Accept-Ranges”字段,这样客户端就认为服务器没有实现范围请求功能,只能老老实实地收发整块文件了。

        请求头 Range 是 HTTP 范围请求的专用字段,格式是“bytes=x-y”,其中的 x 和 y 是以字节为单位的数据范围。

        要注意 x、y 表示的是“偏移量”,范围必须从 0 计数,例如前 10 个字节表示为“0-9”,第二个 10 字节表示为“10-19”,而“0-10”实际上是前 11 个字节。

        Range 的格式也很灵活,起点 x 和终点 y 可以省略,能够很方便地表示正数或者倒数的范围。假设文件是 100 个字节,那么:

  • “0-”表示从文档起点到文档终点,相当于“0-99”,即整个文件;
  • “10-”是从第 10 个字节开始到文档末尾,相当于“10-99”;
  • “-1”是文档的最后一个字节,相当于“99-99”;
  • “-10”是从文档末尾倒数 10 个字节,相当于“90-99”。

六 服务器收到Range字段后的响应过程

  1.         第一,它必须检查范围是否合法,比如文件只有 100 个字节,但请求“200-300”,这就是范围越界了。服务器就会返回状态码 416,意思是“你的范围请求有误,我无法处理,请再检查一下”。
  2.         第二,如果范围正确,服务器就可以根据 Range 头计算偏移量,读取文件的片段了,返回状态码“206 Partial Content”,和 200 的意思差不多,但表示 body 只是原数据的一部分。
  3.         第三,服务器要添加一个响应头字段 Content-Range,告诉片段的实际偏移量和资源的总大小,格式是“bytes x-y/length”,与 Range 头区别在没有“=”,范围后多了总长度。例如,对于“0-10”的范围请求,值就是“bytes 0-10/100”。
  4.         最后剩下的就是发送数据了,直接把片段用 TCP 发给客户端,一个范围请求就算是处理完了。

有了范围请求之后,HTTP 处理大文件就更加轻松了,看视频时可以根据时间点计算出文件的 Range,不用下载整个文件,直接精确获取片段所在的数据内容。不仅看视频的拖拽进度需要范围请求,常用的下载工具里的多段下载、断点续传也是基于它实现的,要点是:

  1. 先发个 HEAD,看服务器是否支持范围请求,同时获取文件的大小;
  2. 开 N 个线程,每个线程使用 Range 字段划分出各自负责下载的片段,发请求传输数据;
  3. 下载意外中断也不怕,不必重头再来一遍,只要根据上次的下载记录,用 Range 请求剩下的那一部分就可以了。

七 多段数据

        刚才说的范围请求一次只获取一个片段,其实它还支持在 Range 头里使用多个“x-y”,一次性获取多个片段数据。这种情况需要使用一种特殊的 MIME 类型:“multipart/byteranges”,表示报文的 body 是由多段字节序列组成的,并且还要用一个参数“boundary=xxx”给出段之间的分隔标记。

        多段数据的格式与分块传输也比较类似,但它需要用分隔标记 boundary 来区分不同的片段,可以通过图来对比一下。

        每一个分段必须以“- -boundary”开始(前面加两个“-”),之后要用“Content-Type”和“Content-Range”标记这段数据的类型和所在范围,然后就像普通的响应头一样以回车换行结束,再加上分段数据,最后用一个“- -boundary- -”(前后各有两个“-”)表示所有的分段结束。

参考:把大象装进冰箱:HTTP传输大文件的方法 (geekbang.org)

通过http传送接收数据  通过http传送接收数据通过http传输文件一般分为传送和接收,简单说来就是你向别人发送文件和接收别人传给你的文件。下面大致说一下这两种情况。1、 向别人发送文件目前觉得简单的方式还是通过http以流的形式发送文件,下面给出一部分代码: /** *//**     * 通过http以流形式传递参数     *      * @param url     *         阅读详情

相关推荐

完美解决HTML5无法上传大文件方法

但是如果有上传文件夹,文件夹中包含很多文件,比如1万或者10万,这种场景下用起来就不是那么的舒服了,如果单个文件的大小超过10G,比如20G,这种场景下用起来也不是特别的舒服。小点的文件还行,能传,大点的就有点费劲了,比如用户要传的10G以上的,单个的也还凑合,但是用户一传就是100个以上。接口地址分别对应:文件初始化,文件数据上传,文件进度,文件上传完毕,文件删除,文件夹初始化,文件夹删除,文件列表。将up6组件复制到项目中。

weixin_52041354的博客 488

HTTP超详细教程

HTTP是超文本传输协议(Hypertext Transfer Protocol)的缩写,是一种用于传输数据的协议。它是基于TCP/IP协议的应用层协议,通常用于Web浏览器和Web服务器之间的通信。HTTP协议的主要特点是简单、灵活、易于扩展和支持多媒体等不同类型的数据传输。

小杨的博客 1万+

HTTP协议16丨把大象装进冰箱:HTTP传输大文件的方法

上次我们谈到了 HTTP 报文里的 body,知道了 HTTP 可以传输很多种类的数据,不仅是文本,也能传输图片、音频和视频。早期互联网上传输的基本上都是只有几 K 大小的文本和小图片,现在的情况则大有不同。网页里包含的信息实在是太多了,随随便便一个主页 HTML 就有可能上百 K,高质量的图片都以 M 论,更不要说那些电影、电视剧了,几 G、几十 G 都有可能。

qq_53280238的博客 944

JAVA+上传一个文件夹

数据库支持MySQL,Oracle,达梦数据库,人大金仓,需要提供前端源码,后端源码,控件源码,公司自己的项目,也有自己的产品,后续需要集成使用,提供7*24小时技术支持服务,提供文档教程,视频教程,远程技术指导,1对1技术支持服务,提供手机,微信,QQ,邮箱,企业微信等联系方式。免费提供7*24小时技术支持,免费提供微信技术支持,免费提供电话技术支持,免费提供QQ技术支持,免费提供远程协助,免费提供远程代码调试服务,免费提供业务逻辑代码定制开发服务,免费提供驻场开发,免费提供上门服务。

alisky119的博客 1280

HTTP传输大文件的方法

目录 数据压缩 分块传输 范围请求 多段数据 小结 HTTP 可以传输很多种类的数据,不仅是文本,也能传输图片、音频和视频。 早期互联网上传输的基本上都是只有几 K 大小的文本和小图片,现在的情况则大有不同。网页里包含的信息实在是太多了,随随便便一个主页 HTML 就有可能上百 K,高质量的图片都以 M 论,更不要说那些电影、电视剧了,几 G、几十 G 都有可能。 相比之下,100M 的光纤固网或者 4G 移动网络在这些大文件的压力下都变成了“小水管”,无论是上传还是下载,都会把...

高山景行,一尘不染 897

04目标检测-Two-stage的目标检测算法

前面我们对进行了对比分析,同时上一篇我们介绍了传统算法在目标检测的原理和效果,此篇我们记录了我学习目标检测算法的深度,深入讲述一下深度学习算法在目标检测的原理和效果。原文链接:https://blog.youkuaiyun.com/qq_41946216/article/details/132800752。版权声明:本文为优快云博主「爱吃面的猫」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。One-stage(YOLO和SSD系列):直接回归目标位置。

qq_41946216的博客 3651

HTTP 传输大文件的几种方案

在JavaScript 中如何实现大文件并发上传?和JavaScript 中如何实现大文件并行下载?这两篇文章中,阿宝哥介绍了如何利用 async-pool 这个库来优化传输大文件的功能。本文阿宝哥将为大家介绍一下 HTTP 传输大文件的几种方案。不过在介绍具体的方案之前,我们先使用Node.js的fs模块来生成一个 “大” 文件。 constfs=require("fs"); constwriteStream=fs.createWriteStream(__dirname+...

qq_34703156的博客 7711

联想Y9000P安装Ubuntu20.04记录

联想Y9000P 2022安装Ubuntu20.04问题记录

Legendyyy的博客 7118

HTTP:传输大文件理论篇

引入 HTTP 可以传输很多种类的数据,不仅是文本,也能传输图片、音频和视频。 在传输大文件时,100M 的光纤固网或者 4G 移动网络在大文件的压力下都将变成“小水管,无论是上传还是下载,都会把网络传输链路路挤的“满满当当” 所以,如何在有限的带宽下高速快捷的传输大文件就成了一个重要的问题。这就好比是已经打开了冰箱门(建立连 接),该怎么把大象(文件)塞进去再关上门(完成传输)呢? 下面就来看看HTTP协议里有哪些手段能解决这个问题 方案 数据压缩 最基本的解决方案,就是数据压缩,把大象变成小猪佩奇,

OceanStar的博客 6782

Qt5开发从入门到精通——第一篇概述

Qt是一个跨平台的C++图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形用户界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组件编程。在Qt程序开发过程中,除可以通过手写代码实现软件开发功能外,还可以通过Qt的GUI界面设计器(QtDesigner)进行界面的绘制和布局。该工具提供了Qt的基本可绘制窗口部件,如QWidget、QLabel、QPushButton和QVBoxLayout等。•对象查看器•属性编辑器。.........

weixin_44759598的博客 9509

java毕设:基于springboot的服装搭配推荐系统(springboot+layui+jq+html)1011

项目描述 基于springboot的服装搭配推荐系统: 基于天气服装搭配推荐系统为用户提供未来一周的天气预报情况,并根据预报天气和用户现有的服装进行着装搭配,以及显示未来6小时精确温度数据为用户提供更精确的天气信息便于用户在出行前对自己的着装进行调整,每日用户可以根据自己当日对系统推荐的着装搭配舒适度进行反馈,系统将根据用户的反馈对用户着装的保暖系数进行相应调整,通过多次的反馈和调整形成对用户着装的个体化和精确化的推荐。 本系统可以为用户提供以下服务: 1.未来五天的天气信息显示; 2.未来六小时内天气温度

qq_2537071370的博客 3647

HTTP协议-11.HTTP传输大文件的方法

早期互联网上传输的基本上都是只有几K大小的文本和小图片,现在的情况则大有不同。网页里包含的信息实在是太多了,随随便便一个主页HTML就有可能上百K,高质量的图片都以M论,更不要说那些电影、电视剧了,几G、几十G都有可能。 相比之下,100M的光纤固网或者4G移动网络在这些大文件的压力下都变成了“小水管”,无论是上传还是下载,都会把网络传输链路挤的“满满当当”。 所以,如何在有限的带宽下高效快捷地传...

凤凰涅磐 5901

uniapp - 实现APP后台持续定位+手机息屏后能持续上传位置信息数据,详解后台保活持续运行+手机锁屏保证后台持续/实时定位的解决方案及示例源码(完美兼容安卓android与苹果ios系统手机)

使用uniapp开发app实现后台保活定位能力,uniapp实时定位保活 息屏定位后台运行,uniapp APP实时定位高德 后台运行 支持锁屏息屏运行,持续获取定位信息,uniapp App端后台间隔时间发送定位功能实现,UniApp实现手机应用常活,固定时间内上传手机位置信息,后台(或锁屏)持续/实时定位的实现方案,uni-app后台持续定位,锁屏后能持续上传位置信息,实现后台定位持续无限制定位高德定位,百度定位,UniApp后台持续定位保如何在APP退到后台时保持定位服务,uniapp 切换app仍能

🏆 前端领域优质创作者 1万+

http大文件传输

随着科技的发展网络传输的资源越来越大,从几k到几M,几G。因此网络传输压力越来越大。 由此http有了解决,大文件传输的方法: 数据压缩传输,可以将大文件进行压缩传输通过Accept-Encoding和Content-Encoding指定压缩类型进行压缩传输。 分块传输:因为音频,视频都是经过高倍压缩,在压缩也起不到什么效果,因此有了分块传输,解决大文件传输。 分块传输因名而异,就是将大文件...

一个很low的程序员 3150

Qt6导航组件系列专栏:30+常见导航场景的实现

本文介绍了Qt6导航组件系列专栏,涵盖30+常见导航场景的实现方案。专栏分为7组:基础侧边栏系列、社交与协作导航系列、文件与项目导航系列、工业与车载导航系列、创意与扩展导航系列、办公与效率导航系列、流程与引导导航系列。

u011186532的专栏 1133

PyTorch实战(12)——图神经网络(Graph Neural Network,GNN)

在本节中,我们首先简要概述了图神经网络 (Graph Neural Network, GNN) 的核心概念与应用,GNN 通过构建计算图分层聚合节点特征,解决了传统神经网络处理图数据时的四大局限:信息深度不足、节点顺序敏感、动态扩展困难和特征稀疏性问题。了解了不同类型的图学习任务(包括节点级、边级和图级三大类)。接着我们研究了几种流行的 GNN 模型,包括:GCN (通过权重共享实现图卷积)、GAT (引入注意力机制区分邻居重要性)和 GraphSAGE (采用随机采样应对大规模图)。

盼小辉丶的博客 3686

HTTP传输大文件的方法、连接管理以及重定向

例如,如果想跳转到 Nginx 官网,就必须在“nginx.org”前把“http://”都写出来,否则浏览器会按照相对 URI 去理解,得到的就会是一个不存在的 URI“http://www.chrono.com/nginx.org”如果有大量的空闲长连接只连不发,就会很快耗尽服务器的资源,导致服务器无法为真正有需要的用户提供服务。浏览器或者爬虫看到 302,会认为原来的 URI 仍然有效,但暂时不可用,所以只会执行简单的跳转页面,不记录新的 URI,也不会有其他的多余动作,下次访问还是用原 URI。

2301_81948543的博客 1444

目标跟踪与视频时序分析基础

两帧均有目标,却因快速移动导致检测框无重叠,仅靠交并比(IoU)无法维持身份关联。本文通过手算与纯Python实现最小跟踪流程,揭示IoU仅为位置线索,不能应对快速位移或遮挡。实验表明,即使目标真实存在,低重叠也会触发新编号。强调跟踪需结合运动预测、外观特征与阈值验证,避免误判。

Mr数据杨 2335

HTTP协议传输大文件及断点续传的方式

HTTP传输大文件及断点续传的方式 文章目录HTTP传输大文件及断点续传的方式1. 数据压缩2. 分块传输3. 范围请求及断点续传4. 多段请求 1. 数据压缩 通常浏览器在发送请求时都会带着 “Accept-Encoding” 头字段,里面是浏览器支持的压缩格式列表,例如 gzip、deflate、br 等,这样服务器就可以从中选择一种压缩算法,放进 “Content-Encoding” 响应头里用来标识这次传输使用的压缩算法,再把原数据压缩后发给浏览器。 优缺点: 数据压缩在处理文本的时候效果还是很好的

立志成为一个前端、后端、测试全方位发展的程序员 3553

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

2.6 HTTP传输大文件

通常浏览器在发送请求时都会带上"Accept-Encoding"头字段,该字段用来声明浏览器支持的压缩格式列表,例如gzip,deflate,br等,这样服务器就可以从中选择一种压缩算法,并将其放进"Content-Encoding"响应头中,最后将元数据压缩后发给浏览器;这种方法的缺点是,gzip等压缩算法通常只是对文本文件有较好的压缩率,而图片,音频,视频的多媒体文件由于本身已经是高度压缩的,此时再使用gzip处理不会变小(甚至还有可能会增大一点),所以这种方法就不适用了;如果不支持的话该怎么办呢?

ztllll007的博客 1156

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【HTTP】989- HTTP 传输大文件的几种方案

在 JavaScript 中如何实现大文件并发上传? 和 JavaScript 中如何实现大文件并行下载? 这两篇文章中,阿宝哥介绍了如何利用 async-pool 这个库来优化传输大文件...

pingan8787 632

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

HTTP第14讲——HTTP传输大文件的方法

HTTP 可以传输很多种类的数据,不仅是文本,也能传输图片、音频和视频。早期互联网上传输的基本上都是只有几 K 大小的文本和小图片,现在的情况则大有不同。网页里包含的信息实在是太多了,随随便便一个主页 HTML 就有可能上百 K,高质量的图片都以 M 论,更不要说那些电影、电视剧了,几 G、几十 G 都有可能。相比之下,100M 的光纤固网或者 4G 移动网络在这些大文件的压力下都变成了“小水管”,无论是上传还是下载,都会把网络传输链路挤的“满满当当”。

Elon15的博客 5029

SpringBoot如何实现HTTP协议的大文件传输?

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

2501_90646777的博客 814

突破传输瓶颈:http-server流式传输大文件的完整指南

你是否曾遇到过传输GB级视频文件时浏览器崩溃?或者用户投诉下载大文档时进度条"卡住"?作为前端开发者或运维人员,大文件传输的稳定性和效率直接影响用户体验。本文将深入解析http-server([项目路径](https://link.gitcode.com/i/c30688810e48cb4dc57d6689432b4a08))如何通过流式传输技术解决这些痛点,让你掌握从原理到实践的完整优化方案。读...

gitblog_00284的博客 562

ED2K vs HTTP:大文件传输效率对比实验

使用Python的随机数模块可以快速生成指定大小的文件。这里有个小技巧:为了模拟真实场景,我让文件内容包含可压缩和不可压缩数据的混合,这样更接近实际使用情况。对于HTTP传输,我使用了Python的requests库,设置了分块传输和断点续传功能。我实际使用时发现它的Python环境配置特别方便,还能一键部署测试服务,省去了很多环境搭建的麻烦。作为一个经常需要处理大文件传输的开发人员,这个问题困扰我很久了,于是决定动手做个实测。我选择用Python来实现,因为它的跨平台性和丰富的库支持特别适合这种任务。

GoldenleafRaven13的博客 888
上一篇: 搭建HTTP测试环境
下一篇: EasyExcel的简单使用
至学者
博客等级 码龄9年 180粉丝 773原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值