2015-02-11 49 views
0

工作我使用下面的代碼動態生成的背景圖像:PHP imagejpeg()未在Opera

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

歌劇顯示什麼,當我嘗試查看該腳本。 Chrome和IE工作正常,如果我添加header('Content-Disposition: attachment; filename=download.jpg'); Opera會按預期下載圖像(並且內容是正確的)。

有沒有解決方法,或者我沒有設置一些標題?我很驚訝Chrome正確處理圖像,而Opera(基於Chromium)則沒有。

更新:同樣的問題是真實的,如果我使用,例如,Content-Type: image/pngimagepng()相反:在所有的瀏覽器,但歌劇負荷和Opera正確下載文件。

更新':這是一個擴展問題,但我不知道爲什麼。將我的網站添加到uBlock的白名單使一切正常。我的網站流量幾乎爲零,當然也不會發送垃圾郵件,所以這很奇怪。

回答

1

在這種情況下,清潔的解決方案將只是把「banner.php」在你的圖片文件夾之一,並把這個文件夾「banner.php」的htaccess的是:

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」爲源,既不歌劇或其他人會知道它是動態生成..

1

有趣 - 我做的完全一樣,它在Opera中打開就好了。唯一的區別就是我加入兩行:

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

有什麼能幫忙的也加入了「內容長度」標頭和getimagesize($ IMG)的結果。也許歌劇院認爲還有更多的事情要做 - 有一個艱難的「退出」。 i.c.w. 「內容長度」可以排除並有望解決您的問題。

更新:和getimagesize()沒有一個動態生成的圖像上工作,但是這一個作用:

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

仍然不知道這是否會解決歌劇院的問題 - 但至少它發送正確的頭..

+0

這是堅果,我無法理解它。我添加了'imagedestroy($ image);退出();'並沒有改變(在任何瀏覽器);因爲圖像是動態生成的(與上面的片段不同,它是MWE),我試過'header('Content-Length:'。strlen(imagejpeg($ image)));'(這是正確的翻譯? 。因爲它適用於所有其他瀏覽器並正確下載,所以我懷疑這與空白有關。我感到困惑。 – kyle 2015-02-11 19:05:57

+1

你完全正確,getimagesize()在動態圖像上不起作用。但是strlen(..)也不會。我只是試過這一個,這是有效的 - 它獲得了一個動態生成的圖像的大小:header('Content-Type:image/jpeg'); ob_start(); imagejpeg($ img); $ size = ob_get_length(); header(「Content-Length:」。$ size); ob_end_flush(); imagedestroy($ img); exit;' – 2015-02-11 19:36:30

0

該問題超出了PHP的範圍。我在Opera中安裝了μBlock,生成圖像的腳本名爲banner.php; EasyList(包含在μBlock中)默認阻止具有src="banner.php"的元素。我想是時候重命名了site-logo.php