2013-03-01 70 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