2

今天早上,我被一个运行 Concrete5 网站的客户打来的电话吵醒,他说上传到他们网站的任何图像突然停止工作。经过一两个小时的实验和研究,我意识到了问题的根本原因。几天前,这个客户得到了一部新手机(三星 Epic),它记录了每张图像的 GPS EXIF 数据。她将这部手机用作她的相机,无论出于何种原因,如果图像中有任何 GPS 数据,Concrete5 就会爆炸。我怀疑这是因为 GPS 数据存储为数组而不是字符串。

如果 GPS EXIF 数据存在,我一直在尝试使用通用函数来删除任何 EXIF 数据。这是我到目前为止所拥有的(位于 内tools/files/importers):

$fileExtension = strtolower(substr($_FILES['Filedata']['name'], strrpos($_FILES['Filedata']['name'], '.')));
if ($fileExtension == ".jpg" || $fileExtension == ".jpeg"){
    /* File is a JPEG */
    if (exif_read_data($_FILES['Filedata']['tmp_name'], 'GPS') !== false){
        /* File contains GPS EXIF data */
        if (extension_loaded('magickwand') && function_exists("NewMagickWand")) {
            /* ImageMagick is installed and working */
            $img = new Imagick($_FILES['Filedata']['tmp_name']);
            $img->stripImage();
            $img->writeImage($_FILES['Filedata']['tmp_name']);
            $img->clear();
        } elseif (extension_loaded('gd') && function_exists('gd_info')) {
            /* GD is installed and working */
            $img = imagecreatefromjpeg($_FILES['Filedata']['tmp_name']);
            imagejpeg ($img, $_FILES['Filedata']['tmp_name']);
        } else {
            /* Neither ImageMagick nor GD are installed */
            die('No appropriate image handler to remove EXIF data');    
        }
    }
}

即使有了这段代码,当我上传图片时,EXIF 数据仍然存在。我尝试在die()整个代码中放置命令,以准确确定代码所采用的路径。在这个特定的服务器上,我从不进入if (extension_loaded('magickwand') && function_exists("NewMagickWand"))区块,但是我确实进入了elseif (extension_loaded('gd') && function_exists('gd_info'))区块。因此,我的 ImageMagick 代码可能还不错,但似乎 GD 没有正确删除 EXIF 数据。

有没有人有使用 ImageMagick/GD 或 PHP 和 EXIF 数据的经验?

4

1 回答 1

1

我在本地机器上进行了测试,试图按照您的方法去除 EXIF 数据,它确实有效~ 它确实添加了以下评论数据:CREATOR: gd-jpeg v1.0 (using IJG JPEG v80), quality = 100

你用的是什么版本的gd-jpeg?

另外,您是否尝试过var_dump拨打电话imagejpeg?它可能会失败~我从来没有很幸运地写过/tmp任何服务器的文件夹。也许你应该在你的 webroot 下设置目标文件。

于 2011-07-22T01:50:41.887 回答