Я использую следующий код для динамического создания фонового изображения:
$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 заставляет все работать. Мой сайт имеет практически нулевой трафик и, конечно, ничего не спамит, так что это странно.
В этом случае более чистым решением было бы просто поместить 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, ни кто-либо другой не будут знать, что он генерируется динамически.
Забавно — я делаю то же самое, и он открывается в Опере просто отлично. Разница лишь в том, что я добавляю две строки:
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 — но по крайней мере он отправляет правильные заголовки.
Проблема выходит за рамки PHP. У меня установлен µBlock в Opera, и скрипт, генерирующий изображения, называется banner.php
; EasyList (входит в µBlock) по умолчанию блокирует элементы с помощью src="banner.php"
, Я думаю, пришло время переименовать его site-logo.php
,