2017-02-16 69 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';