警告 exif_read_data(php3KLADx):第 5 行的 /home/i/public_html/orientation.php 中不支持文件

Ric*_*Joe 3 php

我得到 exif 来读取上传图像的方向。问题是在某些图像中我收到此错误:

警告 exif_read_data(php3KLADx):第 5 行的 /home/i/public_html/orientation.php 中不支持文件

任何想法如何避免这种情况?

<?php
function exif_orientation($file_tmp) {

$image = imagecreatefromstring(file_get_contents($file_tmp));
$exif = exif_read_data($file_tmp);

if(!empty($exif['Orientation'])) {
    switch($exif['Orientation']) {
        case 8:
            $image = imagerotate($image,90,0);
            break;
        case 3:
            $image = imagerotate($image,180,0);
            break;
        case 6:
            $image = imagerotate($image,-90,0);
            break;
    }
    imagejpeg($image, $file_tmp, 90);
}
}
?>
Run Code Online (Sandbox Code Playgroud)

Pet*_*ord 5

您可以使用以下方法抑制警告的输出:

@exif_read_data($file_tmp)

当然,抑制警告并不是一个好主意,但似乎没有办法避免这个警告:没有函数可以在不尝试读取 EXIF 数据并收到警告的情况下测试 EXIF 数据的有效性。

我尝试测试

exif_imagetype($file_tmp)

但某些有效的图像类型可能具有或不具有可读的 EXIF 数据。PNG 就是其中之一:我发现一些示例,其中一个文件可以正常读取,但另一个文件发出警告。

  • 但 try-catch 不会抑制警告。在 30 年的编码生涯中,我一直尝试遵循最佳实践(例如不抑制警告、不使用 goto、绝不允许 case 语句落到下一个),但所有这些事情都有偶尔发生的用例。如果我违反了这些规定规则,我会对代码进行注释以表明我这样做的原因,这样当一些过于热心、资质过高的程序员出现并将其更改为“正确”的东西时,我就知道该归咎于谁停止工作:) (5认同)
  • 今天遇到这个,try catch 不起作用,必须使用@ (3认同)

ami*_*iio 5

你应该这样做,如下所示:

if (!function_exists('imageOrientation'))
{
function imageOrientation(string $directory)
{
    if(file_exists($directory))
    {
        $destination_extension = strtolower(pathinfo($directory, PATHINFO_EXTENSION));
        if(in_array($destination_extension, ["jpg","jpeg"]) && exif_imagetype($directory) === IMAGETYPE_JPEG)
        {
            if(function_exists('exif_read_data'))
            {
                $exif = exif_read_data($directory);
                if(!empty($exif) && isset($exif['Orientation']))
                {
                    $orientation = $exif['Orientation'];
                    switch ($orientation)
                    {
                        case 2:
                            $flip = 1;
                            $deg = 0;
                            break;
                        case 3:
                            $flip = 0;
                            $deg = 180;
                            break;
                        case 4:
                            $flip = 2;
                            $deg = 0;
                            break;
                        case 5:
                            $flip = 2;
                            $deg = -90;
                            break;
                        case 6:
                            $flip = 0;
                            $deg = -90;
                            break;
                        case 7:
                            $flip = 1;
                            $deg = -90;
                            break;
                        case 8:
                            $flip = 0;
                            $deg = 90;
                            break;
                        default:
                            $flip = 0;
                            $deg = 0;
                    }
                    $img = imagecreatefromjpeg($directory);
                    if($deg !== 1 && $img !== null)
                    {
                        if($flip !== 0)
                        {
                            imageflip($img,$flip);
                        }
                        $img = imagerotate($img, $deg, 0);
                        imagejpeg($img, $directory);
                    }
                }
            }
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么还要检查文件扩展名?为什么使用幻数(即“2”)而不是常量(即“IMG_FLIP_BOTH”)?`$deg !== 1` 什么时候会是 FALSE?怎么一点评论都没有? (2认同)