文件上传的基本原理(一)

来源:互联网 发布:cad迷你画图软件 编辑:程序博客网 时间:2024/05/29 15:51

一.概述

 Struts/Spring MVC 文件上传实现都是基于Commons-fileupload,但背后的原理,大多数估计没有关注,最近阅读Commons-fileupload源码也发现,只有基础才是最重要的,万变不离其宗,在it领域不然会被漫天的新技术,冲昏了头,不知所措,下面开始。

二.HTTP报文

1.要想理解文件上传,先要对HTTP报文有一个基本的了解
2.HTTP报文是简单的格式化数据块,每条报文都包含来自客户端(如浏览器)的请求,或者来自服务器的响应
3.HTTP报文由3部分组成
  • 起始行                  - 对报文的描述,所有的HTTP报文都以一个起始行作为开始,即报文的第一行就是起始行
  • 首部                     - 可以有0或多个首部字段,每个首部 字段都包含一个名字和一个值,首部字段后是\r\n,首部以一个空行\r\n结束
  • 实体的主体部分   - 首部恐婚之后就是可选的报文实体,实体的主体是HTTP报文的负荷,传输的内容就在实体的主体中

2.1. 通用首部

 提供一些有用的通用功能,有0个或多个首部字段,每个首部字段以\r\n结束,首部以一个空行\r\n与实体分隔开

2.2 实体首部

1.实体首部指的是用于应对实体主体部分的首部,如实体首部可以说明实体主体部分的数据类型
2.每个实体首部以CRLF结束,紧随就是实体主体的原始数据,不管是文本还是二进制

2.3 实体主体

1.实体的主体就是HTTP报文的负荷,就是HTTP要传输的内容
2.HTTP可以承载很多类型的数据类型:图片、视频、文档等,可以是二进制,也可以是文本


2.4 TCP

1.TCP为HTTP提供了一条可靠的比特传输管道。从TCP一端填入的字节会从另一端以原有的顺序、正确的传送出来,TCP提供了:

  • 无差错的数据传输
  • 按序传输 - 数据总是按照发送的顺序到达
  • 未分段的数据流 - 可以在任何时刻以任意尺寸将数据发送出去

2.HTTP要传送一条报文时,会以流的形式将报文数据的内容通过一条打开的TCP连接按序传输,TCP收到数据流后,会将数据流砍成被称作段的小数据块,并将段封装在IP分组中,通过因特网传输。所有这些工作都是由TCP/IP软件完成的,HTTP程序员什么也看不见

3.只要建立了TCP连接,客户端与服务器之间的报文交换就不会丢失,不会被破坏,也不会在接收时出现错序了。

三.Form表单

<form method="post" name="excel_upload" action="upload.do" enctype="multipart/form-data"><input type="file" name="fileName" accept=".xls,.xlsx" multiple="multiple"></form>
  • method必须为post,值不是放在URL后面传到服务器中的
  • 对于“multipart/form-data”类型的form表单,浏览器上传的实体内 容中的每个表单字段元素的数据之间用字段分隔界线进行分割,两个分隔界线间的内容称为一个分区,每个分区中的内容可以被看作两部分,一部分是对表单字段元 素进行描述的描述头,另外一部是表单字段元素的主体内容
  • accept=".xls, .xlsx"限制了上传文件为Excel
  • multiple="multiple"说明可以同时上传多个文件

四.请求报文

4.1 如果选择2个Excel文件:测试.xlsx和测试1.xlsx


4.2 请求报文


4.3 实体

为了显示观看,故意换行显示,其实是没有的

  1. 首部中Content-Type定义了分隔符boundary,以4个破折号开头
  2. 实体中分隔符 = "\r\n--" + 首部中分隔符boundary
  3. 实体首部Content_Disposition中定义了filename表示上传文件名(name=“fileName”表示input域属性),由于这里是一个input框中上传两个Excel文件,所以这里的2个实体首部中的Content_Disposition的name属性都为fileName
  4. 实体首部Content-Type描述了上传文件的类型,这里表示Sheet工作表,即Excel
  5. 实体首部中多行是以CRLF分隔的,即\r\n
  6. 实体中可能存在多部分,每一部分之间以分隔符boundary分隔,每个部分的实体首部与主体之间以CRLFCRLF分隔,即\r\n\r\n
  7. 符号 - 标志 - 十六进制 - 字节码 , 回车: \r - CR - 0d - 13, 换行:\n - LF - oa - 10




原创粉丝点击