background image

单纯从实现来讲, 我会慢慢介绍这个 MAX_FILE_SIZE 是如何起作用的.
当用户选择了一个文件(laruence.txt), 并填写好文件描述(”laruence

的个人介绍 ), 点击上传

后, 发生了什么呢?

表单提交

在用户确定提交以后, 浏览器会发送如下类似格式的数据包到 form 中 action 属性指定的页
面(在本例中是 upload.php):
//请求头
POST /upload.php HTTP/1.0\r\n
...
Host: www.laruence.com\r\n
...
Content-length: xxxxx\r\n
...
Content-type: multipart/form-data, boundary=--------------7d51863950254\r\n
...\r\n\r\n
//开始 POST 数据内容
---------------7d51863950254
content-disposition: form-data; name="description"
laruence 的个人介绍
---------------7d51863950254
content-disposition: form-data; name="userfile"; filename="laruence.txt"
Content-Type: text/plain
... laruence.txt 的内容...
---------------7d51863950254

接下来, 就是服务器, 是如何处理这些数据了.

接受上传

当 Web 服务器, 此处假设为 Apache(另外假设 PHP 是以 module 方式安装在 Apache 上的), 
接受到用户的数据时, 首先它根据 HTTP 请求头, 通过确定 MIME TYPE 为 PHP 类型, 然后
经过一些过程以后(这部分,可以参看我之前的

PHP Life Cycle ppt

§

), 最终会把控制权交给

PHP 模块.
这个时候, PHP 会调用 sapi_activate 来初始化一个请求, 在这个过程中, 首先判断请求类型, 
此时是 POST, 从而去调用 sapi_read_post_data, 通过 Content-type, 找到 rfc1867 的处理函数
rfc1867_post_handler, 从而调用这个 handler, 来分析 POST 来的数据.
关于 rfc1867_post_handler 这部分的源代码, 可以在 mian/rfc1867.c 找到, 另外也可以参看我
之前

深入理解

 

     PHP

 

     之文件上传

 

 

§

, 其中也列出的源代码.

然后, PHP 通过 boundary, 对于每一个分段, 都通过检查, 是否同时定义了:
 name 和 filename 属性(有名文件上传)
 没有定义 name 定义了 filename(无名上传)
   定义了 name 没有定义 filename(普通数据),