我有一个Perl Dancer Web应用程序,它使用GD动态创建图像。我正在尝试将这些图像作为PNG提供给用户。例如:
package MyApp;
use Dancer ':syntax';
use GD;
...
get '/dynamic_image/:var1/:var2' => sub {
my $im = GD::Image->new(100,100);
my $black = $im->colorAllocate(0,0,0);
my $white = $im->colorAllocate(255,255,255);
$im->rectangle(10,10,90,90,$white);
my $png = $im->png;
return send_file( \$png, content_type => 'image/png', filename => params->{var1}."_".params->{var2}.".png" );
};
然而,当访问上述路线时,Chrome和Firefox似乎不知道如何处理图像数据。如果我尝试在Lightbox中使用该路线,Chrome会抱怨。例如,点击这样的链接时:
<a href="/dynamic_image/my/image" rel="lightbox">link</a>
Chrome控制台说:
资源被解释为图像但使用MIME类型application / octet-stream传输:&#34; http://www.example.com/dynamic_image/my/image&#34;。
看起来Dancer没有正确使用content_type。有趣的是,IE8似乎可以很好地加载图像。知道发生了什么事吗?我目前在Windows 7上使用Strawberry Perl v5.16.2独立运行它。
答案 0 :(得分:1)
解释IE的不同行为:如果IE遇到Content-Type application/octet-stream
,它将尝试扫描文件以确定更具体的MIME类型。这种行为更多地涉及here。
我建议使用Perl的LWP发行版中的GET`命令行工具来确认发生了什么。你可以试试这个:
GET -sSe http://www.example.com/dynamic_image/my/image | less
结果应该包括Content-Type
标题。听起来你会发现它说application/octet-stream
。这开始看起来像是Dancer的一个问题。
您没有指定您正在使用的Dancer版本。 Older versions did not support the content_type
option to send_file()
。如果您正在阅读有关CPAN的最新文档并希望它们适用于旧版本,则可能存在一些混淆。
答案 1 :(得分:1)
这似乎不是舞者的问题。还有其他环境也会发生。 Resource interpreted as Document but transferred with MIME type image
答案 2 :(得分:1)
在我的头撞了一段时间之后,我想我可以回答我自己的问题。 Firefox实际上让我知道我自己的代码中的错误。基本上,当在Firefox中访问动态创建的图像时,它将显示包含HTTP请求信息以及PNG数据的页面。我注意到页面上显示了一些调试文本。事实证明,我在其中一个生成图像数据的循环中留下了print
(我用它来验证图像是否正确构建),并且该文本以某种方式使其成为&#34;图像& #34;本身 - 我认为这会导致Firefox和Chrome发生故障。所以这不是舞者或应用程序错误,而是PEBKAC问题。感谢大家的投入。