文件上传
目录
原理
文件上传:文件从用户本地电脑通过传输方式(web表单)保存到服务器所在电脑指定的目录下。
1、增加文件上传的表单:浏览器请求一个服务器的HTML脚本(包含文件上传表单)
2、用户从本地选择一个文件(点击上传框(按钮))
3、用户点击上传按钮:文件会通过互联网传输到服务器上,
4、服务器操作系统会将文件保存到临时目录:是以临时文件格式保存(Windows下tmp)
5、服务器脚本开始工作:判断文件有效
6、服务器脚本将有效文件从临时目录移动到指定目录下(完成)
表单写法
1)method属性:文件上传表单提交方式必须为POST
2)entype属性:form表单属性,主要是规范表单数据的编码方式。
3)上传表单:file表单
$_FILES变量详解
在PHP中,有一个预定义变量$_FILES是专门用来存储用户上传的文件的。
测试:如果没有enctype属性,上传文件会是什么样子?
1)name:文件在用户(浏览器端)电脑上实际存在的名字(实际用来保留后缀)
2)tmp_name:文件上传到服务器后操作系统保存的临时路径(实际用来给PHP后期使用)
3)type:MIME类型(多功能互联网邮件扩展),是用来在计算机中客户端识别文件类型(确定软件)
4)error:文件上传的代号,用来告知应用软件(PHP)文件接收过程中出现了什么问题(PHP后期根据代码进行文件判断)
5)size:文件大小(后期PHP根据实际需求来确定是否该保留)
移动临时文件到目标位置
文件上传之后会保存到$_FILES,那么访问文件信息的形式就是$_FILES[‘表单name属性值’][‘元素信息’]
1)判断是否为上传文件:is_uploaded_file()
2)移动文件:move_uploaded_file(),也返回布尔值。如果移动成功,文件就被保存到指定目录下。
出现问题:文件权限。
修改c:\windows\temp的访问权限,赋予IUSR_用户可写
多文件上传
当商品需要上传多个图片进行展示的时候:那么需要使用多文件上传
针对一个内容但是不同文件说明:同名表单
当商品需要进行多个维度图片说明的时候:需要使用多个文件上传
针对是不同内容所以表单名字不一样:批量解决问题
多文件上传的$_FILES变量的数据结构形式
批量上传:
1、同名表单,将表单名字形成一个数组,而且同时将文件对应的五个要素:name,tmp_name, size ,type, error都形成对应的数量的数组,每个文件上传对应数组元素的下标都是一样的:name[0]和type[0]是属于同一个文件
2、不同名表单,每个文件都回形成一个属于自己独立的5个元素的数组
对多文件信息的遍历读取和处理
1、不同名多文件上传处理方式:按照表单名字从$_FILES中取出来就可以直接使用(明确知道表单中有多少个文件上传);如果不确定表单中有多少个文件上传,通过遍历$_FILES数组,挨个取出来实现文件上传。
2、同名多文件上传:想办法得到一个文件对应的五个元素数组。从$_FILES中把对应的name\tmp_name\size\error\type挨个取出来,然后存放到不同的数组中。
文件上传后续问题
实现上传功能代码的重复利用:封装文件上传函数
功能:上传文件
条件:条件判断
需要上传的文件信息:对应的5个元素数组
1、文件类型是否合适?外部指定MIME类型
2、文件存储到什么位置?外部指定
3、文件格式限制(文件后缀)?外部限定
4、文件大小限制?外部指定
结果:实现文件上传
1、成功:结果能够在以后看到:需要将文件的路径和文件名字返回
2、失败:返回false,指定错误原因(引用参数)
1)封装除一个上传函数
2)判断文件是否有效
3)判断保存路径是否有效
4)判断文件本身上传的过程中是否有错误
5)文件类型的处理:通过MIME匹配即可
6)文件格式的处理:后缀名的问题
7)文件大小的处理
8)移动到指定目录
9)命名冲突的处理:上传同名文件?中文名字文件怎么办?