Этим утром меня разбудил звонок от клиента, управляющего веб-сайтом 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?