http 文件传输
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 文件传输的更多相关文章
- Linux主机上实现树莓派的交叉编译及文件传输,远程登陆
0.环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS:官网下的的raspb ...
- putty提供的两个文件传输工具PSCP、PSFTP详细介绍
用 SSH 来传输文件 PuTTY 提供了两个文件传输工具 PSCP (PuTTY Secure Copy client) PSFTP (PuTTY SFTP client) PSCP 通过 SSH ...
- c# 局域网文件传输实例
一个基于c#的点对点局域网文件传输小案例,运行效果截图 //界面窗体 using System;using System.Collections.Generic;using System.Compon ...
- 使用 zssh 进行 Zmodem 文件传输
Zmodem 最早是设计用来在串行连接(uart.rs232.rs485)上进行数据传输的,比如,在 minicom 下,我们就可以方便的用 Zmodem (说 sz .rz 可能大家更熟悉)传输文件 ...
- 在windows 与Linux间实现文件传输(C++&C实现)
要实现windows与linux间的文件传输,可以通过socket网络编程来实现. 这次要实现的功能与<Windows下通过socket进行字符串和文件传输>中实现的功能相同,即客户端首先 ...
- Windows下通过socket进行字符串和文件传输
今天在windows平台下,通过socket实现了简单的文件传输.通过实现这一功能,了解基本的windows网络编程和相关函数的使用方法. 在windows平台上进行网络编程,首先都需要调用函数WSA ...
- Linux下几种文件传输命令 sz rz sftp scp
Linux下几种文件传输命令 sz rz sftp scp 最近在部署系统时接触了一些文件传输命令,分别做一下简单记录: 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具 ...
- 艺萌TCP文件传输及自动更新系统介绍(TCP文件传输)(四)
艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开源,作者是英国的,开发时间5年多,框架很稳定. 项 ...
- 艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输)(一)
艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开元,作者是英国的,开发时间5年多,框架很稳定. 项 ...
- SFTP交互式文件传输
sftp 是一个交互式文件传输程式.它类似于 ftp, 但它进行加密传输,比FTP有更高的安全性.下边就简单介绍一下如何远程连接主机,进行文件的上传和下载,以及一些相关操作. 举例,如远程主机的 IP ...
随机推荐
- jquery.nicescroll.min.js滚动条使用方法
jquery.nicescroll.min.js滚动条使用方法,Nicescroll 是制作自定义滚动条的jq插件.支持div,iframe,html等使用,兼容IE7-8,safari,firefo ...
- 黄聪:.NET中zip的压缩和解压——SharpCompress
使用Packaging无法实现通用的zip(使用其他工具压缩)的解压,只支持通过Packaging压缩包zip的解压,而SharpZipLib是基于“GPL”开源方式,风险比较大.在codeplex找 ...
- 两种方式:mysql查看正在执行的sql语句
mysql查看正在执行的sql语句 2015年08月21日 17:32:59 阅读数:15398 有2个方法: 1.使用processlist,但是有个弊端,就是只能查看正在执行的sql语句,对应 ...
- GoJS拖动设计
http://192.168.0.149:8035/gojs/intro/groups.html http://192.168.0.149:8035/gojs/intro/ports.html htt ...
- Jenkins的详细安装
操作环境:Windows 一.环境准备 1 安装JDK 本文采用jdk-8u111-windows-x64.exe: 2 配置tomcat 本文采用tomcat8,无需安装,配置JAVA_HOME及J ...
- C#连接Access数据库显示未在本地计算机注册解决方法
C#连接数据库时会出错 语句如下 string mystr = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Users\hasee ...
- linux上安装telnet服务
[LINUX] 使用yum 安装.开启 telnet 服务 pasting 一.安装telnet 1.检测telnet-server的rpm包是否安装 [root@localhost ~]# rpm ...
- 廖雪峰Java3异常处理-2断言和日志-2使用JDK Logging
1.日志 为了取代System.out.println() 可以设置输出样式 可以设置输出级别,禁止某些级别输出 可以被重定向到文件 可以按包名控制日志级别 2.JDK内置Logging 在java. ...
- 查看设备uuid的命令-blkid
查看设备uuid的命令-blkid 在关联/etc/fstab的时候可以使用 [root@mapper ~]# blkid /dev/sda1: UUID="285510be-b19 ...
- LCA最小公共父节点的解题思路
LCA最小公共父节点解法: 1.二叉搜索树: 中序遍历是升序,前序遍历即按序插入建树的序列. 二叉搜索树建树最好用前序+中序,如果用前序建树,最坏情况会退化为线性表,超时. 最近公共祖先甲级: A11 ...