http 文件传输

https://www.zhihu.com/question/58118565

转载自:http://www.voidcn.com/article/p-rpdhbjib-m.html

        HTTP协议用于文件传输时,一般把文件内容放到消息体中。作为TCP之上的流式传输协议,发送端和接收端可以对大文件进行流式的发送和接收。

1.确定大小的文件传输

        消息头部的Content-Length字段表示文件的长度,用于接收端确定文件的结束。

2.Chunked编码

        当文件大小无法事先确定时,无法设置Content-Length字段。此时可以用分块传输的方式,将文件分成多个部分进行发送。在分块发送方式下,头部增加Transfer-Encoding: chunked,存在这个头部时不允许再加上Content-Length头,即使有也会被忽略。

        Chunked模式下,消息体分块发送,每一块头部存储数据长度,跟上CRLF,然后是具体的数据,块与块之间也是CRLF分隔。当长度头为0时,表示块的结束。

3.使用multipart/form-data上传文件

        原始的POST请求消息体中是URL编码后的表单,格式为key=value,不同的key、value之间用&分隔。上传二进制的文件时,可以用multipart/form-data的方式。

        在这种方式下,基础的请求仍然是POST请求,文件内容放在消息体,只是Content-Type字段的值为multipart/form-data,并随机选择一个字符串作为分隔符(理论上需要这个分隔符不在文件内容中出现,一般随机选择的字符串出现在正文中的概率非常小,如果真的出现会导致POST失败,需要另外发起一次请求重新选择随机字符串),然后,每个字段之间用”--分隔符”进行分隔,最后一个”--分隔符--”表示结束。每个字段中都可以包含头部和消息体,头部的内容可以包含文件名称、文件路径等,也可以是文件的二进制内容本身。

4.断点续传与多线程传输

        这里仍然是运用分块传输的思想:如果传输中途中断,接下来可以从中断的地方重新开始避免从头开始的浪费;在多线程程序中,各个线程可以分别负责传输一个文件块,然后将他们合并恢复成为原始文件。

        分块传输就需要确定块的边界,这里采用的是Range字段,表示从某一字节开始,如Range:bytes=100-,表示请求的是从文件的100字节开始到文件末尾,返回消息为206 Partial Content,头部字段增加Content-Range: bytes100-199/200,表示返回文件100-199字节内容,文件一共200字节。

        多线程传输时,每个线程请求文件中不同的range,传输完成后由应用作合并。

http和ftp文件传输的比较

https://www.oschina.net/news/28162/http-vs-ftp

使用Python创建简单的HTTP和FTP服务

https://www.cnblogs.com/yili16438/p/d3209323913c6d53e6060fcd8d27e4c0.html

http 文件传输的更多相关文章

  1. Linux主机上实现树莓派的交叉编译及文件传输,远程登陆

    0.环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS:官网下的的raspb ...

  2. putty提供的两个文件传输工具PSCP、PSFTP详细介绍

    用 SSH 来传输文件 PuTTY 提供了两个文件传输工具 PSCP (PuTTY Secure Copy client) PSFTP (PuTTY SFTP client) PSCP 通过 SSH ...

  3. c# 局域网文件传输实例

    一个基于c#的点对点局域网文件传输小案例,运行效果截图 //界面窗体 using System;using System.Collections.Generic;using System.Compon ...

  4. 使用 zssh 进行 Zmodem 文件传输

    Zmodem 最早是设计用来在串行连接(uart.rs232.rs485)上进行数据传输的,比如,在 minicom 下,我们就可以方便的用 Zmodem (说 sz .rz 可能大家更熟悉)传输文件 ...

  5. 在windows 与Linux间实现文件传输(C++&C实现)

    要实现windows与linux间的文件传输,可以通过socket网络编程来实现. 这次要实现的功能与<Windows下通过socket进行字符串和文件传输>中实现的功能相同,即客户端首先 ...

  6. Windows下通过socket进行字符串和文件传输

    今天在windows平台下,通过socket实现了简单的文件传输.通过实现这一功能,了解基本的windows网络编程和相关函数的使用方法. 在windows平台上进行网络编程,首先都需要调用函数WSA ...

  7. Linux下几种文件传输命令 sz rz sftp scp

    Linux下几种文件传输命令 sz rz sftp scp 最近在部署系统时接触了一些文件传输命令,分别做一下简单记录: 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具 ...

  8. 艺萌TCP文件传输及自动更新系统介绍(TCP文件传输)(四)

    艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开源,作者是英国的,开发时间5年多,框架很稳定. 项 ...

  9. 艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输)(一)

    艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开元,作者是英国的,开发时间5年多,框架很稳定. 项 ...

  10. SFTP交互式文件传输

    sftp 是一个交互式文件传输程式.它类似于 ftp, 但它进行加密传输,比FTP有更高的安全性.下边就简单介绍一下如何远程连接主机,进行文件的上传和下载,以及一些相关操作. 举例,如远程主机的 IP ...

随机推荐

  1. SSH实现隧道功能穿墙

    Putty和SSH tunnel 目前寻求FQ的方式无非就几种: 寻找web代理(这个可以进我放置的在线代理进行测试) 自行寻找http/sock5代理(这个可以去网上搜索代理ip) vpnFQ(目前 ...

  2. mongoVUE的增删改查操作使用说明(转)

    mongoVUE连接数据库 http://jingyan.baidu.com/album/9989c7460fd171f648ecfe06.html?picindex=1 mongoVUE操作数据库 ...

  3. [Android] Surface、SurfaceHolder与SurfaceView

    其实相当于MVC结构的三者关系:M(Surface).V(SurfaceView).C(SurfaceHolder) 1.Surface Handle onto a raw buffer that i ...

  4. [蓝桥杯]ALGO-8.算法训练_操作格子

    题目描述: 问题描述 有n个格子,从左到右放成一排,编号为1-n. 共有m次操作,有3种操作类型: .修改一个格子的权值, .求连续一段格子权值和, .求连续一段格子的最大值. 对于每个2.3操作输出 ...

  5. 【git之】fetch和 pull的区别

    Git中从远程的分支获取最新的版本到本地有这样2个命令:1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge Git fetch origin master git log ...

  6. gitlab ssh clone问题解决

    公司搭建的gitlab,通过http协议可以clone: [sisi@pre-srv24 gitlab]$ git clone http://gitlab.test.mycompany.com/dev ...

  7. C++进阶--代码复用 继承vs组合

    //############################################################################ /* * 代码复用: 继承 vs 组合 * ...

  8. NGUI 合集

    UILabel  设置BBCode的时候 ,要设置颜色为白色 .不要设为其他的颜色因为会叠加的 .

  9. JAVA代码模板总结

    静态工厂方法+服务提供者框架模板 构造器模板 事件通知模板 单元素枚举类型singleton模块 私有构造器不可实例化类模板

  10. C++之单例类模板

    单例类模板:一个类只能有一个对象,比如超市收银系统中清点物品的仪器只有一个 设计思路: 1.构造函数,拷贝构造函数必须设计为private,防止自己生成新的对象 2.且类的指针要设计为static类型 ...