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. ML平台_饿了么实践

    (转载至:https://zhuanlan.zhihu.com/p/28592540) 说到机器学习.大数据,大家听到的是 Hadoop 和 Spark 居多,它们跟 TensorFlow 是一个什么 ...

  2. GetClass与RegisterClass的应用一例

    利用GetClass与RegisterClass可以实现根据字符串来实例化具体的子类,这对于某些需要动态配置程序的场合是很有用的.其他的应用如子窗体切换,算法替换等都能得到应用. unit Examp ...

  3. Web API 令牌(秘钥是双方约定的,并不在网络连接上传输)

    http://blog.csdn.net/qq289523052/article/details/47750021 秘钥是双方约定的,并不在网络连接上传输 Web API数据传输加密 2015-08- ...

  4. WPF Demo19 命令、UC

    命令系统的基本元素和关系WPF命令系统的组成要素:A.命令(command):WPF命令实际上就是实习了ICommand接口的类.平时使用最多的就是RoutedCommand类.B.命令源(comma ...

  5. sql中的STRFTIME

    STRFTIME返回的是一个字符串 STRFTIME('%w',myTime) in ('1','2','4','5') 可以正确执行,而 STRFTIME('%w',myTime) in (1,2, ...

  6. js copy数组 对象

    js copy数组 slice  concat  浅拷贝 copy 对象 Object.assign({},obj);  es6 ie要用babel转 暴力copy 用JSON.parse(JSON. ...

  7. Linux ssh服务器配置

    配置文件在/etc/sshd_config,注意只有root可rw,其他所有用户权限为---. 配置说明可参考man sshd_config. 如果更改了服务器端口号,并且启用了SELinux,需要执 ...

  8. 基于单片机的Wifi温度湿度测量仪

    这次的制作背景是由于单片机课程实训课程要求 刚好手上有块ESP8266-12F的WiFi模块 于是就选择了制作一个基于单片机,使用WiFi传输数据的温湿度采集测量仪 制作过程: 由于有使用过WiFi模 ...

  9. win server 2003 x64 IIS配置

    新装IIS第一个报错 The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine 原因是 服务器 IIS ...

  10. MyBatis #{} 和 ${} 引用值的用法

    1.#{} 引用值的用法 UserMapper配置文件: <select id="queryOne" resultType="cn.tedu.mybatis.bea ...