gd — PHP imagejpeg () не работает в Opera

Я использую следующий код для динамического создания фонового изображения:

$image = imagecreatefromjpeg( 'FILENAME' );
header( 'Content-Type: image/jpeg' );
imagejpeg( $image );

Opera ничего не отображает, когда я пытаюсь просмотреть этот скрипт. Chrome и IE работают нормально, и если я добавлю header( 'Content-Disposition: attachment; filename=download.jpg' ); Opera загрузит изображение как положено (и содержание правильное).

Есть ли обходной путь для этого или какой-то заголовок, который я не устанавливаю? Я удивлен, что Chrome обрабатывает изображение правильно, а Opera (на основе Chromium) — нет.

Обновить: та же проблема верна, если я использую, например, Content-Type: image/png а также imagepng() вместо этого: загружается во всех браузерах, кроме Opera, и Opera загружает файл правильно.

Обновить’: это проблема расширения, но я не знаю почему. Добавление моего сайта в белый список uBlock заставляет все работать. Мой сайт имеет практически нулевой трафик и, конечно, ничего не спамит, так что это странно.

0

Решение

В этом случае более чистым решением было бы просто поместить banner.php в одну из ваших папок с изображениями и поместить их в .htaccess папки banner.php:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
RewriteRule ^(.*)$ %{ENV:BASE}banner.php [NC,L]

(если вы загрузили mod_rewrite в Apache)

Он проверяет, существует ли изображение, если нет, то позволяет banner.php справиться с заданием.

Таким образом, вы можете просто использовать «banner.jpg» в качестве источника, и ни Opera, ни кто-либо другой не будут знать, что он генерируется динамически.

1

Другие решения

Забавно — я делаю то же самое, и он открывается в Опере просто отлично. Разница лишь в том, что я добавляю две строки:

    header('Content-Type: image/jpeg');
imagejpeg($img);
imagedestroy($img);
exit;

Также может помочь добавление заголовка «Content-Length» с результатом getimagesize ($ img). Возможно, Опера предполагает, что это еще не все — с жестким «выходом»; i.c.w. «Content-Length» вы можете исключить и, надеюсь, решить вашу проблему.

Обновление: getimagesize () не работает с динамически генерируемым изображением, но вот это:

header('Content-Type: image/jpeg');
ob_start();
imagejpeg($img);
$size = ob_get_length();
header("Content-Length: " . $size);
ob_end_flush();
imagedestroy($img);
exit;

Все еще не уверен, решит ли это проблему Opera — но по крайней мере он отправляет правильные заголовки.

1

Проблема выходит за рамки PHP. У меня установлен µBlock в Opera, и скрипт, генерирующий изображения, называется banner.php; EasyList (входит в µBlock) по умолчанию блокирует элементы с помощью src="banner.php", Я думаю, пришло время переименовать его site-logo.php,

0
По вопросам рекламы [email protected]