预览加载中,请您耐心等待几秒...
1/8
2/8
3/8
4/8
5/8
6/8
7/8
8/8

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

PHP文件上传源码分析PHP文件上传源码分析文件上传,一般分为俩种方式FTP和HTTP,对于我们的互联网应用来说:FTP上传虽然传输稳定,但是易用性和安全性都是个问题.你总不至于在用户要上传头像的时候告诉用户”请打开FTP客户端,上传文件到http://www.laruence.com/uploads/中,并以2dk433423l.jpg命名”吧?PHP文件上传源码分析基于HTTP的上传,相对来说易用性和安全性上就比FTP要增强了很多.可以应用的上传方式有PUT,WEBDAV,和RFC1867三种,本文将分析在PHP中,是如何基于RFC1867实现文件上传的.RFC1867RCF1867是Form-basedFileUploadinHTML标准协议,RFC1867标准对HTML做出了两处修改:1为input元素的type属性增加了一个file选项。2input标记可以具有accept属性,该属性能够指定可被上传的文件类型或文件格式列表。另外,本标准还定义了一种新的mime类型:multipart/form-data,以及当处理一个带有enctype=”multipart/form-data”并且/或含有的标记的表单时所应该采取的行为。举例来说,当HTML想让用户能够上传一个或更多的文件时,他可以这么写:选择文件:文件描述:这个表单,大家一定不陌生,而对于PHP来说,它自己另外定义了一个默认表单元素MAX_FILE_SIZE,用户可以通过这个隐藏的表单元素来建议PHP最多只容许上传文件的大小,比如对于上面的例子,我们希望用户上传的文件不能大于5000(5k)字节,那么可以如下写:选择文件:文件描述:姑且不说,这个MAX_FILE_SIZE是多么的不可靠(所以基于浏览器的控制,都是不可靠的),我们单纯从实现来介绍这个MAX_FILE_SIZE是如何起作用的.当用户选择了一个文件(xxxx.txt),并填写好文件描述,点击上传后,发生了什么呢?表单提交在用户确定提交以后,浏览器会根据用户选择的输入,读取要上传的文件,连同表单中的其他元素,组织成一定格式(如下)的数据发送到form中action属性指定的页面(在本例中是upload.php)://请求头POST/upload.phpHTTP/1.0...Host:www.laruence.com...Content-length:xxxxx...Content-type:multipart/form-data,boundary=7d51863950254...//开始POST数据内容--7d51863950254content-disposition:form-data;name="description"laruence的个人介绍--7d51863950254content-disposition:form-data;name="userfile";filename="laruence.txt"Content-Type:text/plain...laruence.txt的内容...--7d51863950254--接下来,就是服务器,是如何处理这些数据了.接受上传当Web服务器,此处假设为Apache(另外假设PHP是以module方式安装在Apache上的),接受到用户的数据时,首先它根据HTTP请求头,通过确定MIMETYPE为PHP类型,然后经过一些过程以后,最终会把控制权交给PHP模块.这个时候,PHP会调用sapi_activate来初始化一个请求,在这个过程中,首先判断请求类型,此时是POST,从而去调用sapi_read_post_data,通过Content-type,找到rfc1867的处理函数rfc1867_post_handler,从而调用这个handler,来分析POST来的'数据.关于rfc1867_post_handler这部分的源代码,可以在mian/rfc1867.c找到,其中也列出的源代码.然后,PHP通过boundary,对于每一个分段,都通过检查,是否同时定义了:name和filename属性(有名文件上传)没有定义name定义了filename(无名上传)定义了name没有定义filename(普通数据),从而进行不同的处理.if((cd=php_mime_get_hdr_value(header,"Content-Disposition"))){char*pair=NULL;intend=0;while(isspace(*cd)){++cd;}while(*cd&&(pair=php_ap_getword(&cd,';')