PHP上传图片 检查并保存到指定路径

本文介绍了基于PHP的图片检查与保存工具类ImageCheck。该工具类用于在上传图片时进行安全检查,确保图片文件安全后再保存到指定路径。详细使用方法及示例代码可在GitHub的开源项目中查看。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ImageCheck — 基于php的图片检查与保存工具类


调用基本说明

请参阅 PHP上传图片检查类与实例用法–接收图片并安全检查后保存到本地


代码全文

<?php
/**
 * Created by PhpStorm.
 * User: haier
 * Date: 2018-2-24
 * Time: 21:07
 */
namespace Image;
use \Exception;
class Image
{
    private $inputFile;
    private $fileName;
    private $fileTmpname;
    /**
     * @return mixed
     */
    public function getFileTmpname()
    {
        return $this->fileTmpname;
    }
    /**
     * @return mixed
     */
    public function getFileName()
    {
        return $this->fileName;
    }
    /**
     * Image constructor.
     */
    public function __construct($inputFile)
    {
        $this->inputFile = $inputFile;
    }
    /** 基本的检查(空与异常),接着进行自定义的图片检查
     * @throws Exception
     */
    public function check()
    {
        //清除文件缓存
        clearstatcache();
        //文件空检查
        if (empty($_FILES)) {
            throw new Exception('未检查到图片文件,请检查是否成功上传', 500);
        }
        //获得文件数据
        $image = $_FILES[$this->inputFile];
        //文件数据异常
        if ($image['error'] != 0) {
            $error = $image['error'];
            throw new Exception($error, 500);
        }
        //进入自定义图片检查
        $this->imageCheck($image);
    }
    /** 自定义图片检查
     * @param $image
     * @throws Exception
     */
    private function imageCheck($image)
    {
        //文件不是通过HTTP post 上传的
        $filetmpname = $image['tmp_name'];
        if (!is_uploaded_file($filetmpname)) {
            throw new Exception('文件非法上传', 500);
        }
        //上传文件过大 报错
        $size = $image['size'];
        if ($size > UPLOAD_FILE_MAX_B) {
            $sizeM = UPLOAD_FILE_MAX_B/1024/1024;
            throw new Exception('文件大小不得超过' . $sizeM . 'M。 当前文件大小为 $size', 500);
        }
        //上传文件的文件类型检查
        //后缀名检查
        $type = $image['type'];
        $typeRegion = eval(ALLOW_FILE_TYPES);
        if (!array_key_exists($type, $typeRegion)) {
            throw new Exception("不支持 $type 类型的文件", 500);
        }
        //文件内容检查
        if (!is_array(getimagesize($filetmpname))) {
            //文件为图片后缀 但无法识别不出图片 可能是冒充图片的文件
            throw new Exception("无法识别该图片文件", 200);
        }
        list($width, $height, $attrNum) = getimagesize($filetmpname);
        /** 注意:这段注释非常重要 请不要删除
         * 文件类型检查。
         * 当限制的文件类型都出现再下面的标记中时,可开启该检查。
         * 索引 2 attrNum 是图像类型的标记:
         * 1 = GIF,2 = JPG,3 = PNG,4 = SWF,
         * 5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byte order),
         * 9 = JPC,10 = JP2,11 = JPX,12 = JB2,
         * 13 = SWC,14 = IFF,15 = WBMP,16 = XBM
         */
        //将图片类型标记存入数组,键表示attrNum,值表示类型
        $attr =['unknown',
            'GIF','JPG','PNG', 'SWF',
            'PSD','BMP','TIFF(intel byte order)','TIFF(motorola byte order)',
            'JPC','JP2','JPX','JB2',
            'SWC','IFF','WBMP','XBM'
        ];
        //只允许的类型标记  2 = JPG,3 = PNG
        $attrArray = [2, 3];
        //支持格式较少 若允许的文件类型并未全部出现在类型标记中 则暂不启用 注释掉attrTypeCheck函数所在行即可
        $this->attrTypeCheck($attrNum,$attrArray);
        /*
         * 自定义的图片比例要求 默认关闭
         * 如果页面有固定的图片裁切器
         * 例如:用户上传图片后,再网页上会进行一个1:1矩形的裁切操作后,才能上传图片(常见于头像上传)
         * 则下面的检查能够保证图片的比例
         */
        //宽高比例为 1:1
        //$this->RatioCheck($width,$height,1,1);
        /**
         * 文件改名以具体情况具体分析
         * 此处为避免图片重名问题
         * 取文件名改名为 时间参数.后缀名
         */
        // 获取略去后缀名的文件名:
//        $filename = substr($filename, 0, strrpos($filename, '.'));
        // 添加时间与后缀名的改名
        $filename = date('Ymd_His') . $typeRegion[$image['type']];
        //保存到参数中
        $this->fileTmpname = $filetmpname;
        $this->fileName = $filename;
    }
    /** 图片类型标记检查
     * @param $attrNum
     * @param $attrArray
     * @throws Exception
     */
    private function attrTypeCheck($attrNum,$attrArray){
        //将图片类型标记存入数组,键表示attrNum,值表示类型
        $attr =['unknown',
            'GIF','JPG','PNG', 'SWF',
            'PSD','BMP','TIFF(intel byte order)','TIFF(motorola byte order)',
            'JPC','JP2','JPX','JB2',
            'SWC','IFF','WBMP','XBM'
        ];
        if (!in_array($attrNum, $attrArray)) {
            //不在类型标记的未知类型
            if($attrNum<0||$attrNum>16){
                $attrNum = 0;
            }
            throw new Exception("不支持的文件类型:$attr[$attrNum]",500);
        }
    }
    /** 图片比例检查
     * @param $width
     * @param $height
     * @param $ratio
     * @throws Exception
     */
    public function RatioCheck($width,$height,$widthNum,$heightNum)
    {
        if($width/$height - $widthNum/$heightNum > 0.001){
            //不符合比例
            throw new Exception("不符合图片比例要求,要求宽高比例为 $widthNum :$heightNum",500);
        }
    }
    /** 移动图片并保存
     * @param $dir
     * @param null $tmpname
     * @param null $filename
     * @throws Exception
     */
    public function move($dir, $tmpname = null , $filename = null )
    {
        //默认取本类的文件参数
        $tmpname = empty($tmpname)?$this->fileTmpname:$tmpname;
        $filename = empty($filename)?$this->fileName:$filename;
        //中文转码
        $filename=iconv("utf-8","gbk",$filename);
        //无目录则创建目录
        if (!is_dir('./'.$dir)) {
            if (!mkdir('./'.$dir, 0777, true)) {
                throw new Exception('图片路径错误', 500);
            }
        }
        //中文转码
        $dirFilename =iconv("utf-8","gbk",$dir.$filename);
        if(!move_uploaded_file($tmpname, './'.$dirFilename)){
            throw new Exception('图片转移失败 ' , 500);
        }
        if (!is_file($dirFilename)) {
            throw new Exception('图片保存失败 ' , 500);
        }
//        获取文件类型
//        $filetype = mime_content_type($filename);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值