今天早上,我被一个运行 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 数据的经验?