3

spark_prによって生成されたコントローラーのメモリに png ファイルがある Rails アプリがあります。

@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

app/views/users/show.html.erb である私のビューでこの png ファイルをレンダリングしたいと思います。これには、@user のさまざまな属性を表示する Rails scaffold ジェネレーターによって生成された標準的なものが含まれています。

ビューでこのメモリ内ファイル (@pngfile) をレンダリングするにはどうすればよいですか? 私はファイルを保存したくありませんし、そのファイルの一時的な URL を提供することさえしたくありません。バイナリ blob からレンダリングされたインライン アイコンを含む HTML ページでこれが行われるのを見たので、それが可能であることはわかっています。しかし、これを可能にする Rails ビュー ヘルパーの魔法の呪文を理解できませんでした。

----------- 編集: 詳細情報 --------------------------

このサイトでは、URL を埋め込む方法について詳しく説明しています。フォルダ アイコンのコードは次のようになります。

<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,"+@pngfile %>

<%=image_tag "data://image/png;base64,"+@pngfile %>

<img src=<%="data:image/png;base64,"+@pngfile %>  ></img>

<img src=<%=raw("data:image/png;base64,"+@pngfile) %>  ></img>

2 つ目以外はすべて失敗し、Chrome と Firefox では機能しましたが、IE9 では機能しませんでした。最初のものは機能するはずでしたが、image_tag ヘルパーのコードは、たとえそれが即時データ URL であっても、デフォルトで URL の前に「/images/」を追加します。別のタブで画像を表示しようとして失敗したため、これを知っています。しかし、「/images/」の部分を取り除いたところ、うまくいきました。2番目のものが機能した理由はわかりません。気まぐれでやってみただけです。3 つ目は、文字列の一部が特殊文字のために壊れているように見えたため、失敗しました。4 つ目で生の文字列を使用してみましたが、どちらも機能しませんでした。

この時点で、私は困惑しています。image_tag にモンキー パッチを適用して、データの先頭に何かを追加しないようにしますか: 埋め込み画像の URL、またはビューの例 3 または 4 のように適切にレンダリングされるように、文字列で何かファンキーなことを行いますか?

4

1 に答える 1

6

私はちょうど同様の問題に直面しました。私の場合、次のように定義base64_imageしましたapplication_helper

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

したがって、あなたの場合、代わりにこれを使用しますimage_tag

base64_image(@png_file)
于 2011-10-26T16:46:26.713 に答える