iptcembed () повреждает данные JPG - PullRequest
0 голосов
/ 21 марта 2020

Похоже, что функция PHP iptcembed() портит файлы JPG.
Эта демонстрация извлекает данные IPT C и сразу же встраивает их снова:

// extract IPTC data
getimagesize($sourceFile,$info);
$iptcData = $info['APP13'];

// embed IPTC data
$newFile = iptcembed($iptcData,$sourceFile);

// write new file to disk
$fp = fopen($sourceFile,"w");
fwrite($fp,newFile);
fclose($fp);

// get size of file
$size = getimagesize($sourceFile,$info);

Предупреждение: getimagesize (): повреждены данные JPEG: в примере 1382 посторонних байта перед маркером. php в строке XX

Что не так?

1 Ответ

1 голос
/ 21 марта 2020

PHP ошибка # 77546 была зарегистрирована 30 января 2019 года:

в ветви php 7.3, иногда поток является недействительным

Это влияет на PHP версии 7.3.0, 7.3.1 и 7.3.2.
Вышло исправление и ошибка исправлена ​​ в PHP 7.3.3 .

[2019-02-08 09:40 UTC] nikic@php.net
Это изменение будет частью PHP 7.3.3.

Я подтвердил, что ошибка не существует в PHP 7.2 или 7.4.


Также было предложено временное решение:

[2019-02-08 05:06 UTC] imagevuex в gmail dot com
Временное решение, проверьте правильность потока изображений с помощью getimagesizefromstring () перед записью в файл:

$content = iptcembed($iptc, $file,0);
if($content && @getimagesizefromstring($content)) // is valid

Также см. PHP 7.3 Предупреждение о критической ошибке , в котором предлагается этот метод обнаружения повреждения изображения:

// PHP 7.3 bug https://bugs.php.net/bug.php?id=77546
// detect if image is corrupt before writing
if(
    version_compare(PHP_VERSION, '7.3') >= 0 && 
    version_compare(PHP_VERSION, '7.3.3') < 0 && 
    !@getimagesizefromstring($content)
) return;
...