标签搜索

PHP 类封装文件上传

sunshine
2022-10-12 / 0 评论 / 41 阅读
温馨提示:
本文最后更新于2022年10月12日,已超过696天没有更新,若内容或图片失效,请留言反馈。

1.1 目标

  1. 更好的理解类的封装特性;
  2. 理解代码根据业务和功能的分类管理思想;
  3. 理解公共控制器的作用,掌握公共控制器的封装;
  4. 掌握PHP面向对象中继承的核心应用;

1.2 文件上传

1.2.1 封装文件上传类

1、在Lib目录下创建Upload.class.php

<?php
namespace Lib;
class Upload{
    private $path;  //上传的路径
    private $size;  //上传的大小
    private $type;  //允许上传的类型
    private $error; //保存错误信息
    
    public function __construct($path,$size,$type) {
        $this->path=$path;
        $this->size=$size;
        $this->type=$type;
    }
    //返回错误信息
    public function getError(){
        return $this->error;
    }
    /*
     * 文件上传
     * @param $files array $_FILES[]
     * @return bool|string 成功返回文件路径,失败返回false
     */
    public function uploadOne($files){
        if($this->checkError($files)){  //没有错误就上传
            $foldername=date('Y-m-d');        //文件夹名称
            $folderpath= $this->path.$foldername;    //文件夹路径
            if(!is_dir($folderpath))
                mkdir($folderpath);
            $filename=uniqid('',true).strrchr($files['name'],'.');//文件名
            $filepath="$folderpath/$filename";    //文件路径
            if(move_uploaded_file($files['tmp_name'],$filepath))
                return "{$foldername}/{$filename}";
            else{
                $this->error='上传失败<br>';
                return false;
            }
        }
        return false;
    }
    //验证上传是否有误
    private function checkError($files){
        //1、验证错误号
        if($files['error']!=0){
            switch($files['error']) {
                case 1:
                    $this->error='文件大小超过了php.ini中允许的最大值,最大值是:'.ini_get('upload_max_filesize');
                    return false;
                case 2:
                    $this->error='文件大小超过了表单允许的最大值';
                    return false;
                case 3:
                    $this->error='只有部分文件上传';
                    return false;
                case 4:
                    $this->error='没有文件上传';
                    return false;
                case 6:
                    $this->error='找不到临时文件';
                    return false;
                case 7:
                   $this->error='文件写入失败';
                    return false;
                default:
                   $this->error= '未知错误';
                    return false;
            }
        }
        //2、验证格式
    $info=finfo_open(FILEINFO_MIME_TYPE);
    $mime=finfo_file($info,$files['tmp_name']);
    if(!in_array($mime, $this->type)){
            $this->error='只能上传'.implode(',', $this->type).'格式';
            return false;
    }
    //3、验证大小
    if($files['size']> $this->size){
            $this->error='文件大小不能超过'.number_format($this->size/1024,1).'K';
            return false;
    }
    //4、验证是否是http上传
    if(!is_uploaded_file($files['tmp_name'])){
            $this->error='文件不是HTTP POST上传的<br>';
            return false;
        }
        return true;
    }
}

1.2.2 封装缩略图类

在Lib目录下创建Image.class.php

<?php
namespace Lib;
class Image{
    /*
     * 制作缩略图
     * @param $src_path 源图的路径
     */
    public function thumb($src_path,$prefix='small_',$w=200,$h=200){
        $dst_img=imagecreatetruecolor($w,$h);   //目标图
        $src_img=imagecreatefromjpeg($src_path);    //源图
        $src_w=imagesx($src_img);
        $src_h=imagesy($src_img);
        imagecopyresampled($dst_img,$src_img,0,0,0,0,$w,$h,$src_w,$src_h);
        $filename=basename($src_path);  //文件名
        $foldername=substr(dirname($src_path),-10); //目录名
        $save_path= dirname($src_path).'/'.$prefix.$filename;
        imagejpeg($dst_img,$save_path);
        return "{$foldername}/{$prefix}{$filename}";
    }
}

1.2.3 实现文件上传

1、register.html

 <form action="" method="post" enctype="multipart/form-data">
     ...

2、更改注册控制器

public function registerAction(){
    //第二步:执行注册逻辑
    if(!empty($_POST)){
        //文件上传
        $path=$GLOBALS['config']['app']['path'];
        $size=$GLOBALS['config']['app']['size'];
        $type=$GLOBALS['config']['app']['type'];
        $upload=new \Lib\Upload($path, $size, $type);
        if($filepath=$upload->uploadOne($_FILES['face'])){
            //生成缩略图
            $image=new \Lib\Image();
            $data['user_face']=$image->thumb($path.$filepath,'s1_');
        }else{
            $this->error('index.php?p=Admin&c=Login&a=register', $upload->getError());
        }
        //文件上传结束
        ...

3、配置文件

 'app'       =>array(
        'path'  =>  './Public/Uploads/',
        'size'  =>  1234567,
        'type'  =>  ['image/png','image/jpeg','image/gif'],

1.3 登录模块

1.3.1 记住密码

登录成功后,如果需要记录用户名和密码,则将用户名和密码记录在cookie中

1561951991167

打开登录页面的时候,获取cookie的值

1561952025351

在视图页面(login.html)页面显示cookie的信息

<input type="text" class="input" name="username" placeholder="登录账号" value="<?=$name?>"  />
...
<input type="password" class="input" name="password" placeholder="登录密码" value="<?=$pwd?>" />

运行结果

1561952112284

1.3.2 安全退出

退出:退出的时候不销毁令牌
安全退出:退出的时候销毁了令牌

top.html

<a class="button button-little bg-yellow" href="index.php?p=Admin&c=Login&a=logout" target="_top">安全退出</a>

_top:表示在最顶端的窗口中打开

控制器(LoginController)

public function logoutAction(){
    session_destroy();
    header('location:index.php?p=Admin&c=Login&a=login');
}
感觉很棒,欢迎点赞 OR 打赏~
0
分享到:

评论 (0)

取消