php的$_FILES如何生成的?

文件上传,一般分为俩种方式FTP和HTTP。

FTP上传虽然传输稳定, 但是易用性和安全性都是个问题,上传的话必须打开FTP客户端,将文件上传到指定目录。这种方法,在遇到用户头像上传这种操作时,肯定是不现实的。

而基于HTTP的上传,相对来说易用性和安全性上就比FTP要增强了很多。可以应用的上传方式有PUT, WEBDAV, 和RFC1867三种。

RFC1867

RCF1867是Form-based File Upload in HTML标准协议, RFC1867标准对HTML做出了两处修改:

  1. 为input元素的type属性增加了一个file选项。
  2. input标记可以具有accept属性,该属性能够指定可被上传的文件类型或文件格式列表。

本标准还定义了一种新的mime类型:multipart/form-data,以及当处理一个带有enctype=”multipart/form-data” 并且/或含有<input type=”file”>的标记的表单时所应该采取的行为。

1.当Web服务器(Apache)接受到用户的数据时,首先根据HTTP请求头,通过确定MIME TYPE为PHP类型。然后经过一些过程以后,最终会把控制权交给PHP模块。

2.PHP会调用sapi_activate来初始化一个请求。在这个过程中, 首先判断请求类型,如果是POST就会去调用sapi_read_post_data, 通过Content-type, 找到rfc1867的处理函数rfc1867_post_handler, 从而调用这个handler, 来分析POST来的数据。

关于rfc1867_post_handler这部分的源代码, 可以在mian/rfc1867.c找到

3.PHP通过boundary, 对于每一个分段, 都通过检查, 是否同时定义了:

  •      name和filename属性(有名文件上传)
  •      没有定义name定义了filename(无名上传)
  •      定义了name没有定义filename(普通数据),

在这个过程中, PHP会去检查文件大小是否超出

4.通过对name和filename的判断, 如果是文件上传, 会根据php的设置, 在文件上传目录中创建一个随机名字的临时文件,返回文件句柄和临时随机文件名。

5.还会有一些验证,比如文件名合法, name合法等。
如果这些验证都通过, 那么就把内容读入, 写入到这个临时文件中。

6.当循环读入完成后, 关闭临时文件句柄,记录临时变量名,并且生成FILE变量。

7.最终交给用户编写的upload.php处理。
这时在upload.php中, 用户就可以通过move_uploaded_file来操作刚才生成的文件了

form-data 中媒体文件标识是什么意思

作者 admin

百度广告效果展示