曲径通幽论坛

标题: multipart/form-data [打印本页]

作者: beyes    时间: 2011-10-18 11:44
标题: multipart/form-data
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 。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2