You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取PHP生成的旋转后新图片的图片类型?

解决旋转图片后获取图片类型的问题

首先,咱们先梳理下你代码里可能导致报错的几个关键点,然后给出可行的修复方案:

1. 变量名拼写错误 & 逻辑矛盾

看你的旋转代码,你生成了$newFileName,但最后却把旋转后的图片写入了原路径$imagePath,而不是新文件路径。同时,在获取类型的代码里你用了$newFilename(注意大小写:newFileName vs newFilename),这大概率是第一个报错点——变量未定义或者指向了不存在的文件。

2. exif_imagetype 的依赖问题

exif_imagetype() 需要PHP开启exif扩展,如果你的服务器没开启这个扩展,函数会直接报错。可以通过phpinfo()检查是否开启,或者换用更兼容的方法。

3. 图片写入完整性问题

旋转后的图片如果没有正确写入磁盘,exif_imagetype() 读取时也会报错。需要确保写入成功,并且目录有足够的写入权限。


修复后的完整方案

第一步:修正图片旋转保存的代码

首先把旋转后的图片正确写入到目标路径,同时处理变量名一致性:

<?php
$server_root = $_SERVER['DOCUMENT_ROOT'];
$auction = $_GET['auction'];
$item = $_GET['item'];
$dir = $_GET['dir'];
$img = urldecode($_GET['img']);
$image = explode('/',$img);
$folder = '/'.$image[3].'/';
$file = $image[4];
$originalImagePath = $server_root . $folder . $file;

// 设置旋转角度
$degrees = ($dir == 'ccw') ? 90 : 270;

// 读取原图片(增加基础错误判断)
$source = imagecreatefromjpeg($originalImagePath);
if (!$source) {
    die('无法读取原图片,请检查路径或文件格式');
}

$rotate = imagerotate($source, $degrees, 0);
if (!$rotate) {
    die('图片旋转失败');
}

// 生成新文件名并拼接完整路径
$newFile = 'img_'.$item.'_'.time().'.jpg';
$newImagePath = $server_root . $folder . $newFile;

// 写入旋转后的图片,指定质量参数并判断写入结果
if (!imagejpeg($rotate, $newImagePath, 90)) { // 第三个参数为图片质量,范围0-100
    die('无法保存旋转后的图片,请检查目录权限');
}

// 清理资源
imagedestroy($source);
imagedestroy($rotate);

// 若需删除原文件,取消下面注释
// unlink($originalImagePath);
?>

第二步:安全获取图片类型的方法

这里提供两种方案,覆盖不同场景需求:

方案A:兼容exif_imagetype的写法(需确保扩展开启)
$typeString = 'unknown';
// 先检查文件是否存在
if (file_exists($newImagePath)) {
    // 检查exif扩展状态
    if (extension_loaded('exif')) {
        $typeInt = exif_imagetype($newImagePath);
        switch($typeInt) {
            case IMG_GIF:
                $typeString = 'image/gif';
                break;
            case IMG_JPG:
            case IMG_JPEG: // 合并JPG/JPEG的判断逻辑
                $typeString = 'image/jpeg';
                break;
            case IMG_PNG:
                $typeString = 'image/png';
                break;
            case IMG_WBMP:
                $typeString = 'image/wbmp';
                break;
            case IMG_XPM:
                $typeString = 'image/xpm';
                break;
            default:
                $typeString = 'unknown';
        }
    } else {
        // 扩展未开启时的备选方案
        $finfo = new Finfo(FILEINFO_MIME_TYPE);
        $typeString = $finfo->file($newImagePath);
    }
} else {
    die('图片文件不存在');
}

echo $typeString;
方案B:不依赖exif扩展的通用方法(推荐)

使用finfo类获取MIME类型,兼容性更强:

$typeString = 'unknown';
if (file_exists($newImagePath)) {
    $finfo = new Finfo(FILEINFO_MIME_TYPE);
    $typeString = $finfo->file($newImagePath);
    // 可选:统一JPEG/JPG的类型标识
    if ($typeString === 'image/jpeg') {
        $typeString = 'image/jpg';
    }
} else {
    die('图片文件不存在');
}

echo $typeString;

额外注意事项

  • 文件权限:确保图片所在目录有写入权限(通常设置为755或775),否则无法保存旋转后的图片。
  • 格式兼容:原代码仅处理JPG格式,如果需要支持PNG、GIF等,需修改imagecreatefromjpeg为对应格式的创建函数,或者增加自动格式判断逻辑。
  • 变量一致性:确保所有涉及文件路径的变量名拼写、大小写完全一致,避免低级错误。

内容的提问来源于stack exchange,提问作者user9664977

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:06:20