目录
一、文件上传的概念
二、文件上传的步骤
(1)表单的制作
三、$_FILES详解
(1)name
(2)tmp_name
(3)type
(4)error
(5)size
四、移动临时文件到目标位置
五、多文件上传
(1)同名表单
1:同名文件的数据结构
2:同名文件的处理方式
(2)不同文件名
1:不同文件名的数据结构
2:不同文件名的处理方式
一、文件上传的概念
文件上传就是文件从用户本地电脑通过传输方式(web表单)保存到服务器所在电脑指定的目录下。
那么文件上传的原理是什么呢?
用户通过文件上传的表单从本地选择文件上传到服务器,服务器操作系统会将文件保存到临时文件夹中,注意是临时文件夹中,然后服务器开始工作,先判断文件是否有效,然后服务器脚本将有效文件从临时文件夹移动到指定目录下
二、文件上传的步骤
(1)表单的制作
1:method属性:表单提交方式必须为post
2:enctype属性:form表单属性,主要是规范表单数据的编码方式
在文件上传时,必须等于的值为multipart/form_data
3:上传表单:file表单
<body> <form method="post" enctype="multipart/form-data" action="xyy.php"> <input type="file" name="wenjian" /> <input type="submit" name="btn" value="提交" /> </form> </body>
三、$_FILES详解
在接收到上传的文件后,服务器端如何接受呢,这就要说到预定义变量$_FILES,它是专门用来存储用户上传的文件的。要注意上传的文件并不是$_POST接收的,而是$_FILES。同时使用$_FILES接受后他会有六个属性,如下图所示。
第一个[wenjian]就是上传文件的name值,后面的name,full_path,type,tmp_name,error,size便是说的属性
(1)name
文件在(浏览器端)用户电脑上的名字。(实际用来看文件的后缀)
(2)tmp_name
文件上传到服务器上操作系统保存到临时路径(实际用来给PHP后期使用)
(3)type
MIME(多功能互联网邮件扩展)类型,用来在计算机客户端识别文件类型,就是比如说一个文件用什么打开,用word打开还是记事本等等。 (实际用来判断给什么软件使用)
(4)error
文件上传的代号,用来告知应用软件(PHP)文件接收过程中出现了什么问题。如:
值=0,没有错误发生,文件上传成功
值=1,上传的文件超过了php.in中upload max filesize选项限制的值
值=2,上传的文件大小超过了HTML表单中MAX_FILE_SIZE选项指定的值
值=3,文件只有部分被上传
值=4,没有文件被上传
值=6,找不到临时文件夹,也就是说操作系统对应的临时文件夹不存在
值=7,文件写入失败,也就是说PHP没有权限将临时文件夹移动到指定目录
(实际用来PHP后期根据代码进行文件判断)
(5)size
文件大小(实际用来判断文件是否保留)
四、移动临时文件到目标位置
临时文件移动到目标位置主要分为两步
(1)判断是否是上传的文件is_uploaded_file()
(2)移动文件move_uploaded_file()
既然想要移动文件,首先我们得获取文件信息,$_FILES['name']可以获取文件,其中的name是表单中的name属性值,获取后我们便需要判断文件是否是上传文件,即is_uploaded_file($_FILES['name']['tmp_name'])需要获得临时路径来判断。
move_uploaded_file($_FILES['name']['tmp_name'],指定路径),他们都有一个返回值,即是否成功,成功为true,否则为false。
<?php header('content-type:text/html;charset=utf-8'); $f=$_FILES['wenjian']; //获取文件 if(is_uploaded_file($f['tmp_name'])){ if(move_uploaded_file($f['tmp_name'],'upload/'.$f['name'])){//这个upload是在apache下的htdocs创建好的 echo '保存成功'; } else{ echo '保存失败'; } } else{ echo '文件上传失败'; } ?>
<body> <form method="post" enctype="multipart/form-data" action="xyy.php"> <input type="file" name="wenjian" /> <input type="submit" name="btn" value="提交" /> </form> </body>
五、多文件上传
多文件上传顾名思义就是上传多个图片,而上传多个图片又分为同名表单和批量解决问题
在具体的实例中同名表单:当商品需要上传多个图片进行展示的时候,如上传的是同一个物品的不同角度,这时候就用到[]就行。
批量解决问题:取得name属性都不一样
(1)同名表单
1:同名文件的数据结构
<?php header('content-type:text/html;charset=utf-8'); echo '<pre>'; print_r($_FILES); ?>
<body> <form method="post" enctype="multipart/form-data" action="xyy.php"> <input type="file" name="image[]" /> <input type="file" name="image[]" /> <input type="file" name="image[]" /> <input type="submit" name="btn" value="提交" /> </form> </body>
同名表单将名字形成一个数组,而且同时将文件对应的五个要素:name,tmp_name,size,type,error都形成对应数量的数组,每个文件上传对应数组元素的下标都是一样的,如:name[0]和tmp_name[0]都属于同一个文件。
2:同名文件的处理方式
<?php header('content-type:text/html;charset=utf-8'); echo '<pre>'; //先判断文件是否存在并且是不是数组即是不是同名文件 if(isset($_FILES['image']['name'])&&is_array($_FILES['image']['name'])){ $images=array(); foreach($_FILES['image']['name'] as $k=>$file){ //这个k就相当于数字下标 $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] ); } } print_r($images); //开始遍历数组一个一个保存 foreach($images as $f){ if(is_uploaded_file($f['tmp_name'])){ move_uploaded_file($f['tmp_name'],'upload/'.$f['name']); } } ?>
(2)不同文件名
1:不同文件名的数据结构
<body> <form method="post" enctype="multipart/form-data" action="xyy.php"> <input type="file" name="image1" /> <input type="file" name="image2" /> <input type="file" name="image3" /> <input type="submit" name="btn" value="提交" /> </form> </body>
<?php header('content-type:text/html;charset=utf-8'); echo '<pre>'; print_r($_FILES); ?>
批量上传:不同名表单每个文件都会形成一个属于自己独立的5个元素的数组
2:不同文件名的处理方式
<?php header('content-type:text/html;charset=utf-8'); foreach($_FILES as $file){ //使用foreach遍历 //$file相当于是每一个文件信息 //开始找到临时路径存放位置 if(is_uploaded_file($file['tmp_name'])){ move_uploaded_file($file['tmp_name'],'upload/'.$file['name']); } } ?>