Я думаю, что проблема неправильного кодирования связана с тем, что вы звоните ob_gzhandler()
напрямую.Он не предназначен для прямого вызова.Если вам нужно проверить, поддерживается ли ob_gzhandler, вы можете проверить следующим образом :
if(!ob_start('ob_gzhandler')) {
die('ob_gzhandler not supported');
}
. После этого изменения заголовок Content-Type
был исправлен и изображение отображалось правильно.Однако содержимое не было сжато.
Похоже, что если вы отправляете заголовок Content-Type: image/png
после запуска буфера вывода, это приводит к тому, что ob_gzhandler не сжимает буфер вывода.Это сработало для меня:
header('Content-type: image/png');
ob_start('ob_gzhandler');
readfile('test.png');
ob_end_flush();
Хотя это не сработало:
ob_start('ob_gzhandler');
header('Content-type: image/png');
readfile("test.png");
ob_end_flush();
При этом, как правило, плохая идея сжать файлы PNG (или JPEG, GIF и т. Д.)поскольку они уже сжаты и, вероятно, не могут быть сжаты намного лучше.Есть ли причина, по которой вы пытаетесь дважды сжать файл PNG?