第四章:第39节 PHP预定义变量$_FILES——上传文件

更新于:2017-12-03 17:20:47

HTML表单不仅能提交字符串数据还能上传文件数据


1.png

HTML标记代码:

1.png

如果表单有上传文件的选项,要注意以下两点:上传方式用post,form表单必需有enctype="multipart/form-data"属性,看下第3行,不然上传不了文件。


文件上传了,怎么去接收它,是用$_POST吗?不是的,需要用预定义变量$_FILES和函数move_uploaded_file配合使用,才能实现文件的真正上传。


1.png

楠神提交了一张图片,我们看看$_FILES都显示哪些数据信息:

1.png

第二个数组显示的是上传文件的信息,因为HTML文件上传表单的name是“img”,所以数组下标也是“img”。我们来看下“img”数组里那5个下标参数都代表什么意思。


$_FILES['img']['name'] 客户端文件的原名称。
$_FILES['img']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"。
$_FILES['img']['size'] 已上传文件的大小,单位为字节。
$_FILES['img']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认,可以在php.ini的upload_tmp_dir 指定。

$_FILES['myFile']['error'] 由文件上传导致的错误代码。为0时,代表文件上传成功。

1.png

关于文件上传这块,我们的PHP手册有详细的介绍

1.png


文件通过表单上传,如果PHP不用代码做些操作,服务器端是不能正常收到文件的。通过$_FILES,可以看到上传的图片文件被临时存在了C:WINDOWS emp目录下(C:Windows empphp2AF5.tmp)。

你可能想去看看在这个目录是否存在php2AF5.tmp这个文件,但结果是:没有!为什么呢? 因为文件被上传结束后,默认地被存储在了临时目录中,这时PHP必须将它从临时目录中删除或移动到其它地方,如果没有,在PHP脚本执行结束以后则会被删除。也就是不管是否上传成功,脚本执行完后临时目录里的文件肯定会被删除,所以在上传之后还要进一步处理。为了保存我们上传的文件,要使用move_uploaded_file函数。首先在网站根目录下创建一个upload文件夹。看代码:


1.png


第20行file_exists这个函数看意思就明白,判断某个路径的文件存不存在。

第23行move_uploaded_file— 将上传的文件移动到新位置

有两个参数,1是现在的文件物理路径2是新文件物理路径。

1.png


文件上传是很重要的实际应用,多用于上传图片,同时也是很容易出现安全问题的一个入口。比如程序员写的代码不够严谨,就像楠神上面的代码,都没有对上传的文件做验证,很容易被其他人恶意上传一个PHP文件,这样他就可以在网站上做坏事了。


程序员可以做哪些验证,主要是类型验证。

1.png

第一种验证方法用的函数in_array

1.png

第二种验证方法用的函数substr

1.png


还可以对上传文件限制大小,比如通过PHP写逻辑判断,或者直接在PHP配置文件php.ini里修改参数。

1.png

1.png


有个地方需要注意:


同时上传多张图片,可以这样写:

1.png

或者这样:

1.png

直接加“multiple”属性。


name的属性值后面一定要加上“[]”,不然只能接收到一张图片。


$_FILES接收后的数据信息显示是这样的:

1.png


course.png


显然我们上面写的代码不能接收图片了,需要改动。这个就交给朋友们自己去修改了,建议朋友们把这个上传图片的功能写到一个函数里。


本节学习代码》》》