Perl Dancer发送带有图像的文件问题

Perl Dancer发送带有图像的文件问题,perl,dancer,Perl,Dancer,我有一个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 $w

我有一个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类型的应用程序/八位字节流传输:“”


看起来Dancer没有正确使用内容类型。有趣的是,IE8似乎可以很好地加载图像。知道发生了什么吗?我目前正在Windows 7上使用草莓Perl v5.16.2独立运行它。

为了解释IE的不同行为:如果IE遇到
应用程序/octet流的内容类型,它将尝试扫描文件以确定更具体的MIME类型。这种行为涵盖的范围更广

我建议使用Perl的LWP发行版中的GET`commandline工具来确认发生了什么。您可以尝试以下方法:

GET -sSe http://www.example.com/dynamic_image/my/image | less
结果应包括
内容类型
标题等内容。听起来你会发现它说的是
application/octet-stream
。这看起来像是舞者的问题


您没有指定正在使用的Dancer的版本。如果您正在阅读CPAN上的最新文档,并希望它们应用于较旧的版本,那么可能会有一些混淆

这似乎不是舞者的问题。在其他环境中也会发生这种情况。

在我的头撞了一会儿之后,我想我可以回答我自己的问题了。Firefox实际上向我透露了我自己代码中的一个bug。基本上,当在Firefox中访问动态创建的图像时,它会显示一个包含HTTP请求信息和PNG数据的页面。我注意到页面上显示了一些调试文本。事实证明,我在生成图像数据的一个循环中留下了一个
print
(我用它来验证图像是否正确构建),而该文本不知怎么地进入了“图像”本身——我认为这导致了Firefox和Chrome有点反常。所以这不是一个舞者或应用程序错误,而是一个PEBKAC问题。谢谢大家的意见。

谢谢,我来试试。我用的是最新版本的Dancer。当我第一次遇到这个问题时,我升级了,希望能解决它。