Tomcat 中是怎么处理文件上传的?
先点赞再看,养成好习惯
前言
这两天在另一个社区看到了一个关于 Tomcat 的提问,还挺有意思。正好自己之前也没思考过这个问题,今天就结合 Tomcat 机制来聊聊这个“为什么”。
本文对 HTTP 协议中的文件上传标准和 Tomcat 机制的分析内容较多,比较基础,不需要的大佬门可以直接跳到文末。
HTTP 协议中的文件上传
众所周知,HTTP 是一个文本协议,那文本协议如何传输文件呢?
直接传……是的就这么简单。文本协议只是在应用层的角度,到了传输层都是数据都是字节,没什么区别,并不用进行额外的编解码。
multipart/form-data 方式
HTTP 协议中规定了一种基于表单的文件上传方式。在 form 中定义一个 ENCTYPE 属性,值为 multipart/form-data,然后增加一个 type 为 file 的 <input>
标签。
<FORM ENCTYPE="multipart/form-data" ACTION="_URL_" METHOD=POST>
File to process: <INPUT NAME="userfile1" TYPE="file">
<INPUT TYPE="submit" VALUE="Send File">
</FORM>
这个 multipart/form-data 类型的表单和默认的 x-www-form-urlencoded 有些不同。虽然都作为表单,可以上传多个字段,但前者可以上传文件,后者却只能传输文本
现在来看看这个表单文件上传方式的协议,下图是一个简单的 multipart/form-data 类型的请求报文:
从上图可以看到,HTTP header 部分没什么变化,只是在 Content-Type 中增加了一段 boundary 标签,但 payload 部分却完全不同
boundary 在 multipart/form-data 中作用是分隔表单的多