2

我有一个使用 GD 动态创建图像的 Perl Dancer Web 应用程序。我正在尝试将这些图像以 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 的控制台说:

资源被解释为 Image 但使用 MIME 类型 application/octet-stream: " http://www.example.com/dynamic_image/my/image "传输。

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

4

3 回答 3

1

解释 IE 的不同行为:如果 IE 遇到 Content-Type application/octet-stream,它将尝试扫描文件以确定更具体的 MIME 类型。这种行为在这里得到了更多的介绍。

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

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

结果应该包括Content-Type标题。听起来你会发现它说application/octet-stream. 这开始看起来像是 Dancer 的问题。

您没有指定您使用的 Dancer 版本。旧版本不content_type支持send_file(). 如果您正在阅读 CPAN 上的最新文档并期望它们适用于旧版本,则可能会有些混乱。

于 2013-03-02T02:56:09.690 回答
1

这似乎不是舞者的问题。还有其他环境也会发生这种情况。 资源解释为文档,但使用 MIME 类型图像传输

于 2013-03-04T13:03:24.227 回答
1

在对此进行了一段时间的抨击之后,我想我可以回答我自己的问题。Firefox 实际上向我提示了我自己代码中的一个错误。基本上,当在 Firefox 中访问动态创建的图像时,它会显示一个带有 HTTP 请求信息以及 PNG 数据的页面。我注意到页面上显示了一些调试文本。事实证明,我print在生成图像数据的循环之一中留下了 a (我用它来验证图像是否正确构建),并且该文本以某种方式使其成为“图像”本身 - 我认为这是导致Firefox 和 Chrome 有点吓人。所以这不是 Dancer 或应用程序错误,而是 PEBKAC 问题。谢谢大家的投入。

于 2013-03-06T16:41:25.993 回答