Multipart/form-data 实际上是浏览器使用表单上传文件的一种方式,比如在写电子邮件时,使用的附件功能便是这种方式的使用实例之一,以及在一些论坛里,网盘上使用的附件上传功能也是如此。
它的通讯方式如下:
首先,客户端与服务器建立链接( TCP 协议)。
接着,客户端向服务器发送数据。
然后,服务器应允后,客户端按照 "multipart/form-data" 的格式向服务器端发送数据。
下面是一个简单的上传页面代码:
[Plain Text] 纯文本查看 复制代码 <html>
<head>
<title>file upload system</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<p align="center">
Welcome to use file uploading system
</p>
<p align="center">
<form method="post" action="upload.php" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="1048576">
<input type="file" name="myfile" size="50"><br><br>
<input type="submit" value="upload">
<input type="reset" value="reset">
</form>
</p>
</body>
</html>
这个页面是个前台页面,后台处理使用了一个 upload.php 的文件进行了处理,这个文件和这里要说明的主题并没有太大关系,所以略去不提。
在这个页面上当我们点选了要上传的文件并点击提交按钮时,文件就会被上传到服务器。用 wireshark 一类的工具捕捉一下数据包,会发现其中有一行:10 0.041209 192.168.1.106 192.168.1.106 HTTP POST /php/upload/upload.php HTTP/1.1 (GIF89a) 这是个 POST 请求,其数据放在请求体内。
由下图可见:
![]()
上图中, boundary 用来隔开表单中不同的数据部分,其值由系统随机产生。紧接着 boundary 的是该部分数据的具体描述,再接下来才是数据。
注意观察,边界 boundary 是由 "--" + "boundary 开始,而结束是由 "--" + "boundary " "--" 结束的。
注意在 html 协议中,使用 \r\n 来换行,而不是 \n 。 |