【问题标题】:warning exif_read_data(php3KLADx): File not supported in /home/i/public_html/orientation.php on line 5警告 exif_read_data(php3KLADx):第 5 行 /home/i/public_html/orientation.php 中不支持文件
【发布时间】:2019-06-23 19:57:14
【问题描述】:

我让 exif 读取上传图像的方向。 问题是在一些图像中我收到了这个错误:

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

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

<?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);
}
}
?>

【问题讨论】:

    标签: php


    【解决方案1】:

    你应该像下面这样:

    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);
                        }
                    }
                }
            }
        }
    }
    }
    

    【讨论】:

    • 为什么还要检查文件扩展名?为什么使用幻数(即2)而不是常量(即IMG_FLIP_BOTH)? $deg !== 1 什么时候会是 FALSE?为什么根本没有 cmets?
    【解决方案2】:

    您可以使用以下命令抑制警告的输出:

    @exif_read_data($file_tmp)

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

    我尝试过测试

    exif_imagetype($file_tmp)

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

    【讨论】:

    • 如果您预计会出现错误,请使用 try-catch。不要使用@
    • 但是 try-catch 不会抑制警告。在 30 年的编码生涯中,我一直试图遵循最佳实践(比如不抑制警告、不使用 goto、永远不允许 case 语句落入下一个语句),但是所有这些偶尔发生的事情都有用例。如果我违反了这些规定性规则,我会对代码进行注释以说明我这样做的原因,以便当一些过分热心、资格过高的程序员出现并将其更改为“正确”的事情时,我知道在程序执行时该怪谁停止工作:)
    • 今天遇到这个,try catch 不行,必须用@
    猜你喜欢
    • 2021-08-11
    • 1970-01-01
    • 2012-05-09
    • 2012-09-16
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多