你说什么都对

  • 首页
  • 技术
  • 工具分享
  1. 首页
  2. 技术
  3. PHP
  4. 正文

PHP实现图片上传并生成缩略图

2022年11月3日 142点热度 0人点赞 0条评论

接解决上传文件失败后,网上找了一段不错的(比较全面且严谨)PHP后台实现文件处理的代码,并解决原来代码中两个错误后记录如下:
需要修改的字段有$filename,$filemax,$filepath,其余基本不需要再做修改了

<?php

class upload{
    protected $filename;//文件名
    protected $fileMine;//文件上传类型
    protected $filepath;//文件上传路径
    protected $filemax;//文件上传大小
    protected $fileExt;//文件上传格式
    protected $fileerror;//文件出错设置
    protected $fileflag;//文件检测
    protected $fileinfo; //FILES
    protected $ext; //文件扩展
    protected $path;
//文件上传
    public function __construct($filename="N_File",$filemax=5000000,$filepath="Notices",$fileflag=true,$fileExt=array('gif','jpeg','pjpeg','jpg','png'),$fileMine=array('image/gif','image/jpeg','image/pjpeg','image/jpg','image/png'))
    {
        $this->filename=$filename;
        $this->fileinfo=$_FILES[$this->filename];
        $this->filemax=$filemax;
        $this->filepath=$filepath;
        $this->fileflag=$fileflag;
        $this->fileExt=$fileExt;
        $this->fileMine=$fileMine;
//var_dump($this->filename);
    }
//错误判断
    public function UpError(){
        if($this->fileinfo['error']>0){
            switch($this->fileinfo['error'])
            {
                case 1:
                    $this->fileerror="上传文件大小超过服务器允许上传的最大值,php.ini中设置upload_max_filesize选项限制的值 ";
                    break;
                case 2:
                    $this->fileerror="上传文件大小超过HTML表单中隐藏域MAX_FILE_SIZE选项指定的值";
                    break;
                case 3:
                    $this->fileerror="文件部分被上传";
                    break;
                case 4:
                    $this->fileerror="没有选择上传文件";
                    break;
                case 5:
                    $this->fileerror="未找到临时目录";
                    break;
                case 6:
                    $this->fileerror="文件写入失败";
                    break;
                case 7:
                    $this->fileerror="php文件上传扩展没有打开";
                    break;
                case 8:
                    $this->fileerror="";
                    break;
            }
            return false;
        }
        return true;
    }
//检测文件类型
    public function UpMine(){
        if(!in_array($this->fileinfo['type'],$this->fileMine)) {
            $this->error="文件上传类型不对";
            return false;
        }
        return true;
    }
//检测文件格式
    public function UpExt(){
        $this->ext=pathinfo($this->fileinfo['name'],PATHINFO_EXTENSION);
//var_dump($ext);
        if(!in_array($this->ext,$this->fileExt)){
            $this->fileerror="文件格式不对";
            return false;
        }
        return true;
    }
//检测文件路径
    public function UpPath(){
        $mtime=date('Y-m-d');
        $this->filepath=$this->filepath.'/'.$mtime;
        if(!file_exists($this->filepath)){
            mkdir($this->filepath,0777,true);
        }
    }
//检测文件大小
    public function UpSize(){
        $max=$this->fileinfo['size'];
        if($max>$this->filemax){
            $this->fileerror="文件过大";
            return false;
        }
        return true;
    }
//检测文件是否HTTP
    public function UpPost(){
        if(!is_uploaded_file($this->fileinfo['tmp_name'])){
            $this->fileerror="恶意上偿还";
            return false;
        }
        return true;
    }
//文件名防止重复
    public function Upname(){
        return md5(uniqid(microtime(true),true));
    }
//图片缩略图
    public function Smallimg($x=300,$y=300){
        $imgAtt=getimagesize($this->path);
//图像宽,高,类型
        $imgWidth=$imgAtt[0];
        $imgHeight=$imgAtt[1];
        $imgext=$imgAtt[2];
//等比列缩放
        if(($x/$imgWidth)>($y/$imgHeight)){
            $bl=$y/$imgHeight;
        }else{
            $bl=$x/$imgWidth;
        }
        $x=floor($imgWidth*$bl); //缩放后
        $y=floor($imgHeight*$bl);
        $images=imagecreatetruecolor($x,$y);
        switch($imgext){
            case 1:
                $imageout=imagecreatefromgif($this->path);
                break;
            case 2:
                $imageout=imagecreatefromjpeg($this->path);
                break;
            case 3:
                $imageout=imagecreatefrompng($this->path);
                break;
            default:
                $imageout=imagecreatefromjpeg($this->path);
        }
        imagecopyresized($images,$imageout,0,0,0,0,$x,$y,$imgWidth,$imgHeight);
        $names=$this->Upname();
        $this->path=$this->filepath.'/'. $names.'.'.$this->ext;
        imagejpeg($images,$this->path);
        return $this->path;
    }
//文件上传
    public function uploads()
    {
        if($this->UpError()&&$this->UpMine()&&$this->UpExt()&&$this->UpSize()&&$this->UpPost()){
            $this->UpPath();
            $names=$this->Upname();
            $this->path=$this->filepath.'/'. $names.'.'.$this->ext;
            if(move_uploaded_file($this->fileinfo['tmp_name'], $this->path)){
                return $this->path;
            }else{
                $this->fileerror="上传失败";
            }
        }else{
            exit("<b>".$this->fileerror."</b>");
        }
    }
}
?>

调用很简单,在文件上传检查的PHP页面加入:

    $u=new upload();
    $a=$u->uploads();
    $c=$u->Smallimg();
    echo "<a href='$a'><img src='$c' /></a>"
标签: 暂无
最后更新:2022年11月3日

老虎猪

健康、快乐、品质生活

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

最近评论
最新 热点 随机
最新 热点 随机
Jenkins部署 在OneNote里使用markdown语法-OneMark 群晖使用花生壳搭建WordPress bootstrap table 图标显示解决 bootstrap div 居中显示 Django根据字段自动从dict中获取值
python records 连接数据库 Eclipse配置PHP开发环境+XDebug调试环境 python版OpenCV常用api调用 Django根据字段自动从dict中获取值 bootstrap table 图标显示解决 PHP将获取的时间显示为你想要的方式

COPYRIGHT © 2022 你说什么都对. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

浙公网安备 33022602000616号