1、知识点
(1)$_FILES数组
[name] | 表示上传文件的原始文件名 |
[type] | 表示上传文件的类型 |
[tmp_name] | 表示上传到服务器文件的临时保存目录 |
[error] | 表示错误及其类型 |
size | 表示文件大小,单位是字节(Byte) |
[error] | 0、1、2、3、4、5、6、7 |
0 | 表示上传成功 |
1 | 表示文件大小超过了php.ini中upload_max_filesize选项限制的值 |
2 | 表示文件大小超过了表单中max_file_size选项指定的值 |
3 | 表示文件只有部分被上传 |
4 | 表示没有文件被上传 |
6 | 表示找不到临时文件夹 |
7 | 表示文件写入失败 |
(2)文件上传表单
在表单中,要想实现文件上传,需要将enctype属性的值设置为“multipart/form-data”,让浏览器知道在表单信息中除了其他数据外,还有上传的文件数据,而浏览器会将表单提交的数据(除了文件数据外)进行字符编码,并单独对上传的文件进行二进制编码。又因为在URL地址栏上不能传输二进制编码数据,所以要想实现文件上传表单,必须将表单提交方式设置为POST方式。
<form method="post" enctype="multipart/form-data">
上传头像:<input name="pic_upload" type="file"/></p>
<input type="submit" value="保存头像"/></p>
</form>
注意:(还没遇到,待验证)
一但form表单用了enctype="multipart/form-data"类型后,所有的值都是以二进制进行传递的。 所以当我们想取出这个表单里传递过来的其它变量的时候,就会遇到一个问题,那就是用request取不到传递过来的变量。
上传文件form表单enctype="multipart/form-data"传值解决办法(代原代码) https://www.cnblogs.com/lengzhijun/p/4155968.html
(3)获取上传文件信息
在PHP获取上传文件时,使用$_FILES二维数组来存储上传文件的信息,该数组的一维保存的是上传文件的名字,二维保存的是该上传文件的具体信息。
print_r($_FILES);//打印$_FILES数组,数组中包含名为“pic_upload”的文件信息。(如上图)
echo $_FILES['pic_upload']['name'];//输出上传文件名称:8ab8ce90bf08a5d603f7bfe4804e5dab943126cf1584a-dvATzi_fw658.jpg
echo $_FILES['pic_upload']['type'];//输出上传文件类型:image/jpeg
echo $_FILES['pic_upload']['tmp_name'];//输出上传后临时文件名:C:\Users\Jiajinjin\AppData\Local\Temp\phpAD9C.tmp
echo $_FILES['pic_upload']['error'];//输出上传文件结果:0
echo $_FILES['pic_upload']['size'];//输出上传文件大小:57898
(4)判断上传文件类型
//获取上传文件的类型
$type=$_FILES['pic_upload']['type'];
/**
* 数组$allow_type中的元素是MIME类型,而MIME类型指的是Internet内容类型描述的事实标准。
* “/”前面的部分表示数据的大类别,如图像image、声音audio等。
* “/”后面的部分表示大类别下的具体类型。
*/
//允许上传文件的类型(jpg、png、gif)
$allow_type=array('image/jepg','image/png','image/gif');
//判断上传文件的类型
if(!in_array($type,$allow_type)){
echo '图像类型不符合要求,允许的类型为:'.implode(",",$allow_type);
return false;
}
(5)move_uploaded_file()
move_uploaded_file(临时文件,目标文件地址)函数,将临时文件保存到指定的目标文件中。
2、用户头像上传(pic_upload.php)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>用户登录</title>
</head>
<body>
<?php
$info=array('id'=>0,'name'=>'浩浩');
?>
<h2>编辑用户头像</h2>
<p>用户姓名:<?php echo $info['name']; ?></p>
<p>现有头像:</p>
<img src="<?php echo './'.$info['id'].'.jpg?rand='.rand(); ?>" onerror="this.src='./default.png' "/>
<form action="" method="post" enctype="multipart/form-data">
<p>上传头像:<input name="pic_upload" type="file"/></p>
<p><input type="submit" value="保存头像"/></p>
</form>
</body>
</html>
<?php
//利用<pre></pre>标签使输出的内容含有空格和换行
echo '<pre>';
/**
* name表示上传文件的原始文件名,type表示上传文件的类型,tmp_name表示上传到服务器文件的临时保存目录,error表示错误及其类型,size表示文件大小,单位是字节(Byte)。
* $_FILES数组中的error有7个值,分别为0、1、2、3、4、5、6、7。
* 0表示上传成功,
* 1表示文件大小超过了php.ini中upload_max_filesize选项限制的值;
* 2表示文件大小超过了表单中max_file_size选项指定的值;
* 3表示文件只有部分被上传;
* 4表示没有文件被上传;
* 6表示找不到临时文件夹;
* 7表示文件写入失败。
*/
print_r($_FILES);//输出获取的上传文件信息
echo '</pre>';
?>
<?php
/**
* 因为被保存在临时文件中的上传文件信息的保存期限为脚本周期,即PHP文件执行的周期。当周期结束时,临时文件就会被释放。
* 所以,需要使用PHP提供的move_uploaded_file(临时文件,目标文件地址)函数将临时文件保存到指定的目标文件地址中。
*/
//判断是否上传头像
if(!empty($_FILES['pic_upload'])){
//获取用户上传文件
$pic_info=$_FILES['pic_upload'];
//判断文件上传到临时文件时是否出错
if($pic_info['error']>0){
$error_msg='上传错误:';
switch($pic_info['error']){
case 1: $error_msg .='文件过大,超过了PHP配置的限制';break;
case 2: $error_msg .='文件过大,超过了Form表单中的限制';break;
case 3: $error_msg .='文件没有上传完毕';break;
case 4: $error_msg .='文件没有上传';break;
case 6: $error_msg .='没有找到临时文件夹';break;
case 7: $error_msg .='临时文件写入失败';break;
}
echo $error_msg;
return false;
}
//获取上传文件的类型
$type=substr(strrchr($pic_info['name'],'.'),1);
//判断上传文件类型
if($type!=='jpg'){
echo '图像类型不符合要求,允许的类型为:jpg';
return false;
}
//使用用户ID为上传文件命名
$new_file=$info['id'].'.jpg';
//设置上传文件保存路径
$filename='./'.$new_file;
//头像上传到临时文件目录成功,将其保存到脚本所在目录下的img文件夹中
if(!move_uploaded_file($pic_info['tmp_name'],$filename)){
echo '头像上传失败';
return false;
}
}
?>