您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > PHP教程-文件上传
PHP文件上传机制与文件系统和服务器的交互文件上传使用目录函数与文件系统的交互使用程序执行函数与环境变量交互文件上传在B/S程序中文件上传已经成为一个常用功能。其目的是客户可以通过浏览器(Browser)将文件上传到服务器(Server)上的指定目录。PHP中文件上传的基础知识表单提交对文件的操作何为文件上传?•传统上的HTML表单只能提交普通文本内容或数值信息。如:inputtype=textname=xxinputtype=passwordname=xx•这种方法无法实现某些系统功能:如:带附件的电子邮件等。•为了满足传递文件信息的需要:HTTP协议实现了文件上传机制,从而可以将客户端的文件通过自己的浏览器上传到服务器上指定目录存放。HTML规范规定上传文件时表单头必须使用htmlheadtitle文件上传/title/headbodyformaction=todo.phpmethod=postenctype=“multipart/form-data”inputtype=hiddenname=MAX_FILE_SIZEvalue=100000上传文件:inputtype=filename=myfilename提交:inputtype=submitvalue=提交查询/form/body/html显示在浏览器上效果如下:•POST方法:表单最常用的功能,向目标页面传递变量,我们在上传文件的时候,会在表单中设置相应的属性,来完成文件的传递•注意几个特征属性:•enctype=multipart/form-data–这样服务器就会知道,我们要传递一个文件,这样服务器可以知道上载的文件带有常规的表单信息。•MAX_FILE_SIZE–控制最大的传递文件的大小(字节)?真的可以控制吗•inputtype=filename=userfile–设置浏览器浏览按钮效果•MAX_FILE_SIZE的值只是对浏览器的一个建议,实际上可以被简单的攻击,我们不要对浏览器端的限制寄予什么希望,它只能避免君子的错误输入,对于普通的web工程师都会跳过浏览器端的限制。•但是最好还是在表单上使用MAX_FILE_SIZE,因为对于善意的错误我们可以帮助纠正,避免用户花费很长的时间等待大文件上传,传了半天,才发现无法上传。•表单提交以后,数据被发送给action的属性指定的PHP程序,这时表单已经完成了它的任务。•静态表单与程序脚本之间的沟通仅仅通过action属性,因此表单可以在任何地方被伪造,如果您的程序完全相信表单提交的数据,就会被木马屠城•我们在服务器端的php.ini中设置对表单传递的数据进一步判断•file_uploads=On/Off是否允许文件上传•upload_max_filesize=2M上传的文件的最大大小•post_max_size=8MPOST数据所允许的最大大小•表单传递的数据,文件只是其中的一部分•所以设置时,upload_max_filesize应该小于post_max_size超级全局数组$_FILES•PHP程序中,需要处理的上传数据保存在全局数组中$_FILES(超级全局数组)•保存$_FILES数组中的元素,将HTML表单的type=file标记的名称name=userfile存放在数组中。•1:存储在$_FILES['userfile']['name']中的值就是:–客户端文件系统的文件的名称•2:存储在$_FILES['userfile']['type']中的值就是:–客户端传递的文件的类型超级全局数组$_FILES•3:存储在$_FILES['userfile']['size']中的值就是:–文件的字节的大小•4:存储在$_FILES['userfile']['tmp_name']中的值就是:–文件被上传后在服务器存储的临时全路径•5:存储在$_FILES['userfile']['error']中的值就是:–文件上传的错误代码-php4.2以后增加的功能存储在$_FILES['userfile']['error']中的值在$_FILES['userfile']['error']中返回的错误代码是在PHP4.2.0版本中引入的。具体如下:值为0:表示没有发生任何错误。值为1:表示上载文件的大小超出了约定值。文件大小的最大值是在PHP配置文件中指定的,该指令是:upload_max_filesize。值为2:表示上载文件大小超出了HTML表单的MAX_FILE_SIZE元素所指定的最大值。值为3:表示文件只被部分上载。值为4:表示没有上载任何文件。文件上传后的临时存放目录•上传的文件被放置到服务器端临时目录:/tmp目录里面命名为一个唯一的,随机生成的临时文件名。注:该文件在程序执行完后将自动被删除掉。在删除前可以像本地文件一样操作。•/tmp目录是默认的上传临时文件存放地点,如果需要更改这个目录:可以编辑/etc/php.ini文件FileUploads段的upload_tmp_dir属性值。上传后的文件处理•使用is_uploaded_file()函数来检查此文件是否是上传文件。•应该使用move_uploaded_file()函数将存放在临时目录下的上传文件拷贝出来。•当配置文件php.ini的register_globals属性被设置成on的情况inputtype=filename=myfilename将生成全局变量:$myfilename等文件上传后的处理页面htmlheadtitle上传文件.../title/headbodyh1上传文件.../h1?phpif($_FILES['userfile']['error']0){echo'上传错误:';switch($_FILES['userfile']['error']){case1:echo‘上传文件大小超出了PHP配置文件中的约定值:upload_max_filesize';break;case2:echo'上传文件大小超出了表单中的约定值:max_file_size';break;case3:echo'文件只被部分上载';break;case4:echo'没有上传任何文件';break;}exit;}if($_FILES['userfile']['type']!='text/plain'){echo'问题:文件不是一个文本文件。';exit;}$upfile='./uploads/'.$_FILES['userfile']['name'];if(is_uploaded_file($_FILES['userfile']['tmp_name'])){//判断是否为上传文件if(!move_uploaded_file($_FILES['userfile']['tmp_name'],$upfile)){//移动文件echo'问题:不能将文件移动到指定目录。';exit;}}else{echo'问题:上传文件不是一个合法文件:';echo$_FILES['userfile']['name'];exit;}echo'文件上传成功!brbr';?/body/html当需要上传多个文件的情况,有两种实现的解决方法:使用不同的表单元素inputtype=filename=file_ainputtype=filename=file_b使用数组格式的表单元素inputtype=filename=file[1]inputtype=filename=file[2]使用目录函数在用户上载一些文件之后,能够看到所上传的文件,并可以操作这些文件的内容对他们来说是非常必要的。PHP提供了一系列目录函数与文件系统函数,他们都是实现此功能的非常有用的工具。从目录读取:opendir--打开目录句柄resourceopendir(stringpath[,resourcecontext])closedir--关闭目录句柄voidclosedir(resourcedir_handle)readdir--从目录句柄中读取条目stringreaddir(resourcedir_handle)htmlheadtitle浏览上传目录/title/headbodyh1浏览/h1?php$current_dir='./uploads/';$dir=opendir($current_dir);echop上传目录是:$current_dir/p;echo'p上传列表:/pul';while($file=readdir($dir)){echoli$file/li;}echo'/ul';closedir($dir);?/body/html创建和修改目录mkdir--新建目录boolmkdir(stringpathname[,intmode])如:mkdir(/path/to/my/dir,0700);rmdir--删除目录boolrmdir(stringdirname)注意:权限问题,有可能不成功。13.3与文件系统的交互除了能够查看并获得与目录有关的信息,我们还可以获得Web服务器上文件的信息,并且与这些文件进行交互。前面我们已经了解了如何读文件和写文件。我们还可以使用许多其他的文件函数。获取文件信息:如下页实例:文件状态函数和他们的运行结果htmlheadtitle显示上传目录下文件的相关属性信息/title/headbody?php$current_dir='./uploads/';$file=basename($file);echo'h1Detailsoffile:'.$file.'/h1';$file=$current_dir.$file;echo'h2Filedata/h2';echo'Filelastaccessed:'.date('jFYH:i',fileatime($file)).'br';echo'Filelastmodified:'.date('jFYH:i',filemtime($file)).'br';$user=posix_getpwuid(fileowner($file));echo'Fileowner:'.$user['name'].'br';$group=posix_getgrgid(filegroup($file));echo'Filegroup:'.$group['name'].'br';echo'Filepermissions:'.decoct(fileperms($file)).'br';echo'Filetype:'.filetype($file).'br';echo'Filesize:'.filesize($file).'bytesbr';echo'h2Filetests/h2';echo'is_dir:'.(is_dir($file)?'true':'false').'br';echo'is_executable:'.(is_executable($file)?'true':'false').'br';echo'is_file:'.(is_file($file)?'true':'false').'br';echo'is_link:'.(is_link($file)?'true':'false').'br';echo'is_readable:'.(is_readable($file)?'true':'false').'br';echo'is_writable:'.(is_writable($file)?'true':'false').'br';?/body/html使用程序执行函数
本文标题:PHP教程-文件上传
链接地址:https://www.777doc.com/doc-5197019 .html