2017-02-16 51 views
-1

所以我試圖用一個http頁面顯示一個圖像,就像你在瀏覽器上用「View Image」得到的那樣。我得到了這麼多,我不知道還有什麼我必須做的,讓Firefox閱讀我該死的圖像數據。需要使用Perl顯示base64圖像的標題?

open (my $fh, "<", "/where/the/base64_encoded_img/is"); 
local $/= undef; 
my $image = <$fh>; 
close $fh; 
local $/= "\n"; 

use MIME::Base64; 
my $alpha; 
$alpha .= "Content-type: image/png;base64 \n"; #our image is a PNG 
$alpha .= "Content-length: " . MIME::Base64::encoded_base64_length($image) . " \n\n "; 
$alpha .= " "; 
#~ $alpha .= "<img src='$image'/>"; 
$alpha .= "$image"; 
print $alpha; 

考慮到我嘗試都具有和不具有「數據:our_data_type;字符集= UTF-8; BASE64,」 散列圖像之前串(該字符串被包含在$圖像內變量)。

+2

這是一個CGI腳本?不需要base64作爲圖像的HTTP響應。只需發送圖像!如果您直接發送PNG以響應HTTP請求(而不是將其嵌入到某個HTML中,則返回相同的響應),那麼'data:'URI方案是無關緊要的。 –

+0

'$ image'是否包含原始圖像數據?然後,在輸出之前,您需要對其進行Base64編碼。 – mob

+1

我不是專家,但我從未見過Content-Type的附加符號,附加了base64。我會用Content-Transer-Encoding來指定base64的東西。另外,您的圖像是否已經在base64文件中?如果沒有,你可能會遇到問題。 –

回答

1

HTTP以二進制形式發送有效載荷就好了。沒有辦法使用base64,也不需要它。

+0

因此無論如何,爲了顯示它,我必須解碼它? – user4654137

+0

你不應該首先編碼它。 – DaSourcerer

+0

我想這是由於這樣的事實,即CSS應該能夠保存這種格式的圖像,我不知道如果我添加** **或**背景的相同圖像,但沒有編碼,圖像:**然後Firefox(或任何通用瀏覽器)將只下載一次並緩存它。如果從數據庫加載這種格式的圖像會更快;作爲一個blob(正常圖像),或從fs本身。 – user4654137

-1
my $image = <$fh>; 

我不建議這樣做。使用二進制讀取。

添加一個content-transfer-encoding標題,您可以發送base64或二進制。 關閉I/O緩存($|)或者可能發生奇怪的事情。從項目

+1

HTTP中沒有「content-transfer-encoding」標題字段。 –

+0

在base64編碼圖像上啓用binmode?我認爲這只是文字? – user4654137

1

放逐的base64,做你的腳本的這個最小版本:

open (my $fh, "<", "/where/the/img/is"); 

{ 
    local $/= undef; 
    my $image = <$fh>; 
    close $fh; 
} 

print "Content-Type: image/png\n\n"; 
print $image; 

注意,使用local的一點是,該變量的前值被包含塊結束時自動恢復。如果你不把它放在一個塊中,並手動恢復默認值,local不會爲你做任何事情。

即使這應該是足夠好:

print "Content-Type: image/png\n\n"; 
exec 'cat', '/where/the/img/is';