文件从用户本地电脑通过传输方式(web表单)保存到服务器所在电脑指定的目录下。
1、增加文件上传的表单:浏览器请求一个服务器的HTML脚本(包含文件上传表单)
2、用户从本地选择一个文件(点击上传框(按钮) )
3、用户点击上传:文件会通过互联网传输到服务器上
4、服务器操作系统会将文件保存到临时目录:以临时文件格式保存(windows下tmp)
5、服务器脚本开始工作:判断文件有效
6、服务器脚本将有效文件从临时目录移动到指定目录下(完成)
表单写法
method属性:表单提交方式必须为POST
enctype属性:form表单属性:主要是规范表单数据的编码方式
上传表单:file表单
$_FILES变量详解(该变量必须大写)
在PHP中,有一个预定义变量$_files是专门用来存储用户上传的文件
name:文件在用户(浏览器端)电脑上实际存在的名字(实际用来保留后缀) tmp_name:文件上传到服务器后操作系统保存的临时路径(实际用来给PHP后期使用) type:MIME(多功能互联网邮件扩展)类型,用来在计算机中客户端识别文件类型(确定软件) error:文件上传的代号,用来告知应用软件(PHP)在文件接收过程中出现了什么问题(PHP后期根据代码进行文件判断) size:文件大小(PHP根据实际需求确定是否该保留)
移动临时文件到目标位置
文件上传之后会保存到$_files中,那么访问文件信息的形式就是$_files['表单 name属性值']['元素信息']...
1、判断是否为上传的文件:is_uploaded_file() 2、移动文件:move_upload_file()多文件上传 场景:
当商品需要上传多个图片进行展示的时候:那么需要使用多文件上传
针对一个内容,但是不同文件:同名表单
当商品需要进行多个维度图片说明的时候:需要使用多文件上传
针对不同内容,所以表单名字不同:批量解决问题
多文件上传的$_FILES变量的数据结构形式 批量上传:同名表单将表单名字形成一个数组,而且同时将文件对应的五个要素:name、tmpname、size、type、error都形成对应数量的数组
批量上传:不同名表单
每个文件都会形成一个属于自己独立的5个元素的数组
对于拿到的两种结果的处理:对多文件信息的遍历读取和处理 1、不同名多文件上传:
按照表单名字从$_FILES中取出来就可以直接使用(明确知道表单中有多少个文件上传);如果不确定表单中有多少个文件上传,不适合挨个去取(效率不高),可以通过遍历$_FILES数组,挨个取出来实现文件上传
foreach($_FILES as $file){ //$file就是一个完整的上传文件信息 //找到临时路径,指定存放路径 if (is_uploaded_file($file['tmp_name'])){ //存储 move_uploaded_file($file['tmp_name'],'uploads/' . $file['name']); }} 2、同名多文件上传:想办法得到一个文件对应的五个元素数组。从$_FILES中把对应的name/tmp_name/size/error/type 挨个取出来,然后存放到不同的数组中
此时遍历$_FILES没有意义,只有一个数组元素;应该遍历$_FILES['userfile'] ['任意一个要素:name/tmp_name/size/error/type']
//判断元素存在而且是数组:name有:代表是文件,name元素有多个,代表是同名批量上传if(isset($_FILES['image']['name']) && is_array() ){ //遍历,构造数组元素 $image = array(); //存储所有的文件信息,一个元素代表一个文件(数组) foreach($_FILES['image']['name'] as $k => $file){ $images = array( 'name' => $file , 'tmp_name' => $_FILES['image']['tmp_name'][$k], 'type' => $_FILES['image']['type'][$k], 'error' => $_FILES['image']['error'][$k], 'size' => $_FILES['image']['size'][$k] ); }}