2013-03-01 71 views
2

我有一个使用GD动态创建图像的Perl Dancer Web应用程序。我正在尝试将这些图像作为PNG提供给用户。例如:Perl Dancer send_file问题

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 /八位字节流移送:“http://www.example.com/dynamic_image/my/image”。

它看起来像舞者没有正确使用content_type。有趣的是,IE8似乎加载图像就好了。任何想法发生了什么?我目前正在使用Strawberry Perl v5.16.2在Windows 7上独立运行它。

回答

1

经过一段时间,我的头撞了一下,我想我可以回答我自己的问题。 Firefox实际上给我带来了我自己的代码中的一个错误。基本上,当在Firefox中访问动态创建的图像时,它将显示带有HTTP请求信息和PNG数据的页面。我注意到一些调试文本显示在页面上。事实证明,我在产生图像数据的循环之一中留下了一个print(我用它来验证图像是正确构建的),并且该文本以某种方式将它自己变成了“图像” - 我假设导致Firefox和Chrome出现一些偏差。所以这不是一个舞者或应用程序错误,而是一个PEBKAC问题。感谢大家的意见。

1

解释IE的不同行为:如果IE遇到内容类型application/octet-stream,它将尝试扫描该文件以确定更具体的MIME类型。该行为涵盖了更多here

我推荐使用Perl的LWP发行版中的GET命令行工具来确认发生了什么。你可以试试这个:

GET -sSe http://www.example.com/dynamic_image/my/image | less 

结果除其他外应包括Content-Type头。听起来你会发现它说application/octet-stream。这开始看起来像舞者的问题。

你没有指定你正在使用的舞者的版本。 Older versions did not support the content_type option to send_file()。如果您正在阅读CPAN上的最新文档并希望它们适用于旧版本,则可能会出现一些混淆。

+0

谢谢,我会试试看。我正在使用最新版的舞者。当我第一次遇到希望能够解决问题的问题时,我进行了升级。 – indiguy 2013-03-02 03:10:31