2011-08-25 26 views
3

我有一個Rails應用程序,在控制器的內存中有一個png文件,由spark_pr生成。Rails3:在視圖中渲染內存中的圖像

@pngfile << Spark.plot([47, 43, 24, 47, 16, 28, 38, 57, 50, 76, 42, 20, 98, 34, 53, 1, 55, 74, 63, 38, 31, 98, 89], :has_min => true, :has_max => true, 'has_last' => 'true', 'height' => '40', :step => 10, :normalize => 'logarithmic') 
@user=User.all.first 

我想呈現在我看來,這是應用程序/視圖/用戶/ show.html.erb這個png文件,並且它具有由Rails的腳手架發電機在此它顯示各種屬性所產生的標準的東西@user。

如何在我的視圖中渲染這個內存文件(@pngfile)?我不想保存該文件,也不想爲該文件提供臨時URL。我已經在HTML頁面上看到了這一點,它使用二進制blob呈現的內嵌圖標,所以我知道這是可能的。但我無法弄清楚使用Rails視圖助手的魔術咒語,這使得這成爲可能。

-----------編輯:更多信息-------------------------

This site給有關如何嵌入網址的更多信息。文件夾圖標的代碼如下所示:

<img src="data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub/ 
/ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcpp 
V0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7" 
width="16" height="14" alt="embedded folder icon"> 

我在我的視圖中嵌入了此確切代碼,它適用於Chrome,Firefox和IE9。

所以我試圖用我的火花情節。

在我的Rails控制器,我這樣做:

@pngfile = Base64.encode64 Spark.plot([47, 43, 24, 47, 16, 28, 38, 57, 50, 76, 42, 20, 98, 34, 53, 1, 55, 74, 63, 38, 31, 98, 89], :has_min => true, :has_max => true, 'has_last' => 'true', 'height' => '40', :step => 10, :normalize => 'logarithmic') 

在我看來,我嘗試了一些不同的技巧

<%=image_tag "data:image/png;base64,"[email protected] %> 

<%=image_tag "data://image/png;base64,"[email protected] %> 

<img src=<%="data:image/png;base64,"[email protected] %> ></img> 

<img src=<%=raw("data:image/png;base64,"[email protected]) %> ></img> 

都失敗了,除了第二個,它在Chrome工作, Firefox,但不是IE9。 第一個應該可以工作,但是image_tag幫助程序的代碼默認預設爲「/ images /」,即使它是立即數據URL。我知道這是因爲我試圖在不同的選項卡中查看圖像,並且失敗了。但是當我剝離「/ images /」部分時,它運行良好。 我不知道爲什麼第二個人工作。我只是隨心所欲地嘗試了它。 第三個失敗,因爲它看起來像字符串的部分由於特殊字符被分解。我嘗試在第四個使用原始字符串,但它也沒有工作。

在這一點上,我很難過。我是否嘗試猴子補丁image_tag,以便它不預先填充數據的內容:用於嵌入圖像的URL,還是我會對字符串做一些時髦的事情,以便像視圖示例3或4一樣正確渲染它?

回答

5

我剛剛面臨類似的問題。就我而言,我在application_helper定義base64_image

def base64_image image_data 
    "<img src='data:image/png;base64,#{image_data}' />".html_safe 
end 

所以你的情況,你只希望用這個來代替image_tag

base64_image(@png_file)