HTML表单不仅能提交字符串数据还能上传文件数据,
HTML标记代码:
如果表单有上传文件的选项,要注意以下两点:上传方式用post,form表单必需有enctype="multipart/form-data"属性,看下第3行,不然上传不了文件。
文件上传了,怎么去接收它,是用$_POST吗?不是的,需要用预定义变量$_FILES和函数move_uploaded_file配合使用,才能实现文件的真正上传。
楠神提交了一张图片,我们看看$_FILES都显示哪些数据信息:
第二个数组显示的是上传文件的信息,因为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时,代表文件上传成功。
关于文件上传这块,我们的PHP手册有详细的介绍
文件通过表单上传,如果PHP不用代码做些操作,服务器端是不能正常收到文件的。通过$_FILES,可以看到上传的图片文件被临时存在了C:WINDOWS emp目录下(C:Windows empphp2AF5.tmp)。
你可能想去看看在这个目录是否存在php2AF5.tmp这个文件,但结果是:没有!为什么呢? 因为文件被上传结束后,默认地被存储在了临时目录中,这时PHP必须将它从临时目录中删除或移动到其它地方,如果没有,在PHP脚本执行结束以后则会被删除。也就是不管是否上传成功,脚本执行完后临时目录里的文件肯定会被删除,所以在上传之后还要进一步处理。为了保存我们上传的文件,要使用move_uploaded_file函数。首先在网站根目录下创建一个upload文件夹。看代码:
第20行file_exists这个函数看意思就明白,判断某个路径的文件存不存在。
第23行move_uploaded_file— 将上传的文件移动到新位置
有两个参数,1是现在的文件物理路径2是新文件物理路径。
文件上传是很重要的实际应用,多用于上传图片,同时也是很容易出现安全问题的一个入口。比如程序员写的代码不够严谨,就像楠神上面的代码,都没有对上传的文件做验证,很容易被其他人恶意上传一个PHP文件,这样他就可以在网站上做坏事了。
程序员可以做哪些验证,主要是类型验证。
第一种验证方法用的函数in_array
第二种验证方法用的函数substr
还可以对上传文件限制大小,比如通过PHP写逻辑判断,或者直接在PHP配置文件php.ini里修改参数。
有个地方需要注意:
同时上传多张图片,可以这样写:
或者这样:
直接加“multiple”属性。
name的属性值后面一定要加上“[]”,不然只能接收到一张图片。
$_FILES接收后的数据信息显示是这样的:
显然我们上面写的代码不能接收图片了,需要改动。这个就交给朋友们自己去修改了,建议朋友们把这个上传图片的功能写到一个函数里。