Этим утром меня разбудил звонок от клиента, работающего на веб-сайте Concrete5, который сказал, что любые изображения, загруженные на их веб-сайт, внезапно перестали работать. После часа или двух экспериментов и исследований я понял основную причину проблемы. Пару дней назад у этого клиента появился новый мобильный телефон (Samsung Epic), который записывает данные GPS EXIF для каждого изображения. Она использовала этот мобильный телефон в качестве своей камеры, и по какой-либо причине, если на изображении есть данные GPS, тогда Concrete5 взрывается. Я подозреваю, что это потому, что данные GPS хранятся в виде массива, а не строки.
Я пытался работать над общей функцией удаления любых данных EXIF, если существуют данные GPS 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?