2

GDを使用して動的に画像を作成するPerlDancerWebアプリケーションがあります。これらの画像を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は画像データをどう処理するかを認識していないようです。ライトボックスでルートを使用しようとすると、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は画像を問題なくロードしているようです。何が起こっているのか分かりますか?私は現在、StrawberryPerlv5.16.2を搭載したWindows7でスタンドアロンで実行しています。

4

3 に答える 3

1

しばらくこれに頭を悩ませた後、私は自分の質問に答えることができると思います。Firefox は実際に、自分のコードのバグを教えてくれました。基本的に、Firefox で動的に作成された画像にアクセスすると、HTTP リクエスト情報と PNG データを含むページが表示されます。ページにデバッグ用のテキストが表示されていることに気付きました。print画像データを生成するループの 1 つに. Firefox と Chrome はちょっとびっくりします。つまり、これは Dancer やアプリケーションのバグではなく、PEBKAC の問題です。皆さん、ご意見ありがとうございます。

于 2013-03-06T16:41:25.993 に答える
1

ダンサーの問題ではないようです。それが起こる他の環境もあります。 リソースはドキュメントとして解釈されますが、MIME タイプのイメージで転送されます

于 2013-03-04T13:03:24.227 に答える
1

IE の異なる動作を説明するには: IE が Content-Typeapplication/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 に答える