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

$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
kyle 11 Фев 2015 в 21:16

3 ответа

Лучший ответ

В этом случае более чистым решением было бы просто поместить '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]

(при условии, что в Apache загружен mod_rewrite)

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

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

1
Jeroen Flamman 11 Фев 2015 в 19:52

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

0
kyle 11 Фев 2015 в 19:26

Забавно - я делаю то же самое, и в Opera оно открывается просто отлично. Единственная разница в том, что я добавляю две строки:

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

Также может помочь добавление заголовка Content-Length с результатом getimagesize ($ img). Возможно, Opera предполагает, что впереди еще кое-что - с жестким «выходом»; 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
Jeroen Flamman 11 Фев 2015 в 19:42