文件与图像技术_用户头像上传

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;
    }
}
?>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值