【问题标题】:Perl Dancer send_file Issue with ImagesPerl Dancer send_file 图像问题
【发布时间】:2013-03-07 00:41:25
【问题描述】:

我有一个使用 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 的控制台说:

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

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

【问题讨论】:

    标签: perl dancer


    【解决方案1】:

    解释 IE 的不同行为:如果 IE 遇到 application/octet-stream 的 Content-Type,它将尝试扫描文件以确定更具体的 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 上的最新文档并期望它们适用于旧版本,则可能会有一些混淆。

    【讨论】:

    • 谢谢,我试试看。我正在使用最新版本的 Dancer。当我第一次遇到问题时我升级了,希望能解决它。
    【解决方案2】:

    这似乎不是舞者的问题。还有其他环境也会发生这种情况。 Resource interpreted as Document but transferred with MIME type image

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2014-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-28
        • 1970-01-01
        • 2019-10-30
        相关资源
        最近更新 更多