假设接受文件的网页程序位于 http://192.168.29.65/upload_file/UploadFile.假设我们要发送一个图片文件,文件名为“kn.jpg”,

首先客户端链接 192.168.24.56 后, 应该发送如下http 请求:

  POST/logsys/home/uploadIspeedLog!doDefault.html HTTP/1.1 Accept: text/plain, */* Accept-Language: zh-cn Host: 192.168.24.56Content-Type:multipart/form-data;boundary=-----------------------------7db372eb000e2User-Agent: WinHttpClient Content-Length: 3693Connection: Keep-Alive-------------------------------7db372eb000e2Content-Disposition: form-data; name="file"; filename="kn.jpg"Content-Type: image/jpeg(此处省略jpeg文件二进制数据...)-------------------------------7db372eb000e2--

此内容必须一字不差,包括最后的回车,红色字体部分就是协议的头。给服务器上传数据时,并非协议头每个字段都得说明,其中,content-type是必须的,它包括一个类似标志性质的名为boundary的标志,它可以是随便输入的字符串。对后面的具体内容也是必须的。它用来分辨一段内容的开始。Content-Length: 3693 ,这里的3693是要上传文件的总长度。绿色字体部分就是需要上传的数据,可以是文本,也可以是图片等。数据内容前面需要有Content-Disposition, Content-Type以及Content-Transfer-Encoding等说明字段。最后的紫色部分就是协议的结尾了。

注意这一行:

Content-Type: multipart/form-data; boundary=---------------------------7db372eb000e2

根据 rfc1867, multipart/form-data是必须的.
  ---------------------------7db372eb000e2 是分隔符,分隔多个文件、表单项。其中b372eb000e2 是即时生成的一个数字,用以确保整个分隔符不会在文件或表单项的内容中出现。Form每个部分用分隔符分割,分隔符之前必须加上"–“着两个字符(即–{boundary})才能被http协议认为是Form的分隔符,表示结束的话用在正确的分隔符后面添加”–"表示结束。

前面的 ---------------------------7d 是 IE 特有的标志,Mozila 为---------------------------71.

每个分隔的数据的都可以用Content-Type来表示下面数据的类型,可以参考rfc1341 (http://www.ietf.org/rfc/rfc1341.txt)

例如 :Contect-Type:image/jpeg 表示下面的数据是jpeg文件数据

============================================================================

[转]通过 http 协议上传文件

2008-04-30 23:55
1、概述
在最初的 http 协议中,没有上传文件方面的功能。 rfc1867 ( http://www.ietf.org/rfc/rfc1867.txt ) 为 http 协议添加了这个功能。客户端的浏览器,如 Microsoft IE, Mozila, Opera 等,按照此规范将用户指定的文件发送到服务器。服务器端的网页程序,如 php, asp, jsp 等,可以按照此规范,解析出用户发送来的文件。
Microsoft IE, Mozila, Opera 已经支持此协议,在网页中使用一个特殊的 form 就可以发送文件。
绝大部分 http server ,包括 tomcat ,已经支持此协议,可接受发送来的文件。
各种网页程序,如 php, asp, jsp 中,对于上传文件已经做了很好的封装。
2、上传文件的实例:用 servelet 实现(http server 为 tomcat 4.1.24)

  1. 在一个 html 网页中,写一个如下的form :
<form enctype="multipart/form-data" action="http://192.168.29.65/UploadFile" method=post>load multi files :<br><input name="userfile1" type="file"><br><input name="userfile2" type="file"><br><input name="userfile3" type="file"><br><input name="userfile4" type="file"><br>text field :<input type="text" name="text" value="text"><br><input type="submit" value="提交"><input type=reset>
</form>
  1. 服务端 servelet 的编写
    现在第三方的 http upload file 工具库很多。Jarkata 项目本身就提供了fileupload 包http://jakarta.apache.org/commons/fileupload/ 。文件上传、表单项处理、效率问题基本上都考虑到了。在 struts 中就使用了这个包,不过是用 struts 的方式另行封装了一次。这里我们直接使用 fileupload 包。至于struts 中的用法,请参阅 struts 相关文档。
    这个处理文件上传的 servelet 主要代码如下:
public void doPost( HttpServletRequest request, HttpServletResponse response ) {DiskFileUpload diskFileUpload = new DiskFileUpload();// 允许文件最大长度diskFileUpload.setSizeMax( 100*1024*1024 );// 设置内存缓冲大小diskFileUpload.setSizeThreshold( 4096 );// 设置临时目录diskFileUpload.setRepositoryPath( "c:/tmp" );List fileItems = diskFileUpload.parseRequest( request );Iterator iter = fileItems.iterator();for( ; iter.hasNext(); ) {FileItem fileItem = (FileItem) iter.next();if( fileItem.isFormField() ) {// 当前是一个表单项out.println( "form field : " + fileItem.getFieldName() + ", " + fileItem.getString() );} else {// 当前是一个上传的文件String fileName = fileItem.getName();fileItem.write( new File("c:/uploads/"+fileName) );}}
}

为简略起见,异常处理,文件重命名等细节没有写出。
3、 客户端发送内容构造
假设接受文件的网页程序位于 http://192.168.29.65/upload_file/UploadFile.
假设我们要发送一个二进制文件、一个文本框表单项、一个密码框表单项。文件名为 E:\s ,其内容如下:(其中的XXX代表二进制数据,如

01 02 03)
a
bb
XXX
ccc

客户端应该向 192.168.29.65 发送如下内容:

POST /upload_file/UploadFile HTTP/1.1
Accept: text/plain, */*
Accept-Language: zh-cn
Host: 192.168.29.65:80
Content-Type:multipart/form-data;boundary=---------------------------7d33a816d302b6
User-Agent: Mozilla/4.0 (compatible; OpenOffice.org)
Content-Length: 424
Connection: Keep-Alive
-----------------------------7d33a816d302b6
Content-Disposition: form-data; name="userfile1"; filename="E:\s"
Content-Type: application/octet-stream
a
bb
XXX
ccc
-----------------------------7d33a816d302b6
Content-Disposition: form-data; name="text1"
foo
-----------------------------7d33a816d302b6
Content-Disposition: form-data; name="password1"
bar
-----------------------------7d33a816d302b6--

此内容必须一字不差,包括最后的回车。
注意:Content-Length: 424 这里的424是红色内容的总长度(包括最后的回车)
注意这一行:
Content-Type: multipart/form-data; boundary=---------------------------7d33a816d302b6
根据 rfc1867, multipart/form-data是必须的.
---------------------------7d33a816d302b6 是分隔符,分隔多个文件、表单项。其中33a816d302b6 是即时生成的一个数字,用以确保整个分隔符不会在文件或表单项的内容中出现。前面的 ---------------------------7d 是 IE 特有的标志。 Mozila 为---------------------------71
用手工发送这个例子,在上述的 servlet 中检验通过。
(上面有一个回车)用户可以选择多个文件,填写表单其它项,点击“提交”按钮后就开始上传给http://192.168.29.65/upload_file/UploadFile 这是一个 servelet 程序
注意 enctype=“multipart/form-data”, method=post, type=“file” 。根据 rfc1867, 这三个属性是必须的。multipart/form-data 是新增的编码类型,以提高二进制文件的传输效率。具体的解释请参阅 rfc1867

Transfer-Encoding: chunked

一、背景:

持续连接的问题:对于非持续连接,浏览器可以通过连接是否关闭来界定请求或响应实体的边界;而对于持续连接,这种方法显然不奏效。有时,尽管我已经发送完所有数据,但浏览器并不知道这一点,它无法得知这个打开的连接上是否还会有新数据进来,只能傻傻地等了。
用Content-length解决:计算实体长度,并通过头部告诉对方。浏览器可以通过 Content-Length 的长度信息,判断出响应实体已结束
Content-length引入的新问题:由于 Content-Length 字段必须真实反映实体长度,但是对于动态生成的内容来说,在内容创建完之前,长度是不可知的。这时候要想准确获取长度,只能开一个足够大的 buffer,等内容全部生成好再计算。但这样做一方面需要更大的内存开销,另一方面也会让客户端等更久。
我们需要一个新的机制:不依赖头部的长度信息,也能知道实体的边界——分块编码(Transfer-Encoding: chunked)

二、分块编码(Transfer-Encoding: chunked)

Transfer-Encoding,是一个 HTTP 头部字段(响应头域),字面意思是「传输编码」。最新的 HTTP 规范里,只定义了一种编码传输:分块编码(chunked)。
分块传输编码(Chunked transfer encoding)是超文本传输协议(HTTP)中的一种数据传输机制,允许HTTP由网页服务器发送给客户端的数据可以分成多个部分。分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供。
数据分解成一系列数据块,并以一个或多个块发送,这样服务器可以发送数据而不需要预先知道发送内容的总大小。
具体方法
在头部加入 Transfer-Encoding: chunked 之后,就代表这个报文采用了分块编码。这时,报文中的实体需要改为用一系列分块来传输。
每个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的 CRLF(\r\n),也不包括分块数据结尾的 CRLF。
最后一个分块长度值必须为 0,对应的分块数据没有内容,表示实体结束。
例:

HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked25\r\n
This is the data in the first chunk\r\n1C\r\n
and this is the second one\r\n3\r\ncon\r\n8\r\n
sequence\r\n0\r\n\r\n

Content-Encoding 和 Transfer-Encoding 二者经常会结合来用,其实就是针对 Transfer-Encoding 的分块再进行 Content-Encoding压缩。

http post 文件报文相关推荐

  1. md5sum算法 —— linux或Unix上,md5sum是用来计算和校验文件报文摘要的工具程序

    md5sum帮助命令: [root@jie openssl]# md5sum --help Usage: md5sum [OPTION]... [FILE]... Print or check MD5 ...

  2. python txt文件 报文分析_Python读写txt文本文件的操作方法全解析

    一.文件的打开和创建 >>> f = open('/tmp/test.txt') >>> f.read() 'hello python!\nhello world! ...

  3. 使用FileOutPutStream下载docx文件报文件已损坏解决

    代码发布到linux之后,通过接口下载了文件,打开文件提示文件已损坏,但是强行打开却是可以看到内容的,很奇怪. 在网上也找了好多办法,没能解决,最终是在响应头里加入一个Length之后,下载文件打开不 ...

  4. newFile()一个http绝对路径的文件报文件找不到错误的解决方式

    如果你也遇到和我一样使用newFile本地文件可以通过,可是一旦路径变成http的绝对路径就会报找不到文件的错误,可以用下面的方式来解决 啥都不多说,具体解决方式如下(亲测有效) public get ...

  5. 用 Dubbo 传输文件?被老板一顿揍

    以下文章来源方志朋的博客,回复"666"获面试宝典 公司之前有一个 Dubbo 服务,其内部封装了腾讯云的对象存储服务 SDK,目的是统一管理这种三方服务的SDK,其他系统直接调用 ...

  6. linux 函数 文件校验,Linux中的文件效验命令

    在网络传输.设备之间转存.复制大文件等时,可能会出现传输前后数据不一致的情况.这种情况在网络这种相对更不稳定的环境中,容易出现.那么校验文件的完整性,也是势在必行的. md5sum命令用于生成和校验文 ...

  7. linux md5 加密字符串和文件方法

    linux md5 加密字符串和文件方法 MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改.MD5全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意 ...

  8. MFC使用http post请求上传文件

    文章目录 前言 代码 前言 笔者在Windows编程开发时候,有个上传文件的需求,服务端给的接口是http接口,和网页上面 表单上传文件一样(form-data方式).当然我们拿到这需求,一想 用Wi ...

  9. [ SHELL编程 ] 远程服务器传输文件

    在shell编程中经常需要获取远程服务器文件.手工操作中使用scp命令完成.为避免脚本执行scp输入密码进行交互,需先建立本机服务器当前用户和远程服务器指定用户的信任关系.具体代码见操作实例,重点关注 ...

最新文章

  1. 急需降低系统复杂性,我们从 Kafka 迁移到了 Pulsar
  2. hibernate关联关系(多对多)
  3. mvc重定向方式详解
  4. Javascript中的陷阱大集合【译】
  5. python functools import wraps_python装饰器中functools.wraps的作用详解
  6. java delegate怎么写_美团面试官:你说你们公司的Mybatis分页插件是你写的,给我说说它的设计原理?...
  7. C语言试题四十八之该函数可以统计一个长度为2的字符串在另一个字符串中出现的次数。
  8. 前端学习(1957)vue之电商管理系统电商系统之创建新分支
  9. Java ByteArrayInputStream markSupported()方法与示例
  10. 打开Excel文件时出现提示:“向Excel发送命令时出现错误”解决方案
  11. git版本回退(回退提交到本地仓库代码)
  12. 威联通_万兆加持!威联通QNAP TS-932X,首次入手威联通NAS简单体验
  13. 手机 debian linux,Android上的Ubuntu Debian Armel
  14. mac安装xdebug
  15. 字体识别在线工具-整理
  16. 学计算机跨考航天航空,北京航空航天大学计算机考研辅导班:跨考考研经验
  17. 【PPT】极简PPT设计方法
  18. 树莓派利用OpenCV的图像跟踪、人脸识别等
  19. mip-html自动跳转页面,MIP建站系统常见问题汇总
  20. CDH添加ELASTICSEARCH服务elasticsearch-cdh-parcels

热门文章

  1. LED手电筒真不咋滴8/27
  2. Python布尔类型详解
  3. ioio+android测试软件,IOIO Hardwarer Tester
  4. Unity+XLua+阿里云热更代码
  5. 心法利器[88] | 有关大模型幻觉问题的思考
  6. 安卓指纹识别demo
  7. Android Studio 自带模拟器解决输入中文问题_安装x86的搜狗输入法的APK
  8. 奖补100万!2022年武汉市智能制造试点示范企业申报流程及条件梳理
  9. 配置phpStorm实现remote host远程同步开发
  10. JZOJ 1481. 偷懒的西西【推荐】