タペストリーの画像でdata uri スキームを使用しようとしたことはありません-動作することは確かですが、これを呼び出すには、tml にこれを含めるだけです:
<t:DBImage image="${entity.BlobImage}" />
また、DBImage コンポーネント内で、image
パラメーターをバイト配列に変換する方法が必要になります。
この手法の実用的な例を作成するのに時間をかけたくありませんが、この種の問題を解決する方法を紹介します。
html ドキュメント内のイメージ レンダリングと同様に、2 つの別個の要求が必要です (data uri スキームを使用しない場合)。
- 画像タグをレンダリングするためのページの html (つまり
http://host/context/app/mypage
)
- 画像データ(すなわち
http://host/context/app/myimage
)
リクエスト 1 では、画像の URL を作成して img タグに入れます。
<html>
...
<img src="/context/app/myimage/params" />
...
</html>
リクエスト 2 は、画像データのバイト ストリームを返すだけです。
2 番目のリクエストから始めましょう。その方が理にかなっているからです。
タペストリーでは、個々の要求は、ページ クラスとオプションでtml
テンプレートを作成することによって処理されます。バイト ストリームを提供するには、ページ クラスだけが必要です。パラメーターまたはコンテキストをページに渡すには、コンテキスト パラメーターを使用します。
package myproject.pages;
public class MyImage
{
public StreamResponse onActivate(String parameter)
{
// retrieve your image using the context parameter(s)
final InputStream imageStream = getImage(parameter);
return new StreamResponse()
{
@Override
public InputStream getStream() throws IOException
{
return imageStream;
}
@Override
String getContentType()
{
return "image/png";
}
@Override
void prepareResponse(Response response)
{}
};
}
}
この時点で、URL「http://host/context/app/myimage/parameter」を使用して画像をリクエスト/レンダリングできます。これを img タグに含める必要があるだけです。つまり、リクエスト 1 です。
そのため、最初にリンクを生成する必要があります。これは、ページ クラスで行う必要があります。
パッケージ myproject.pages;
public class MyPage
{
@Inject
private PageRenderLinkSource pageLink;
public Link getImageLink()
{
return pageLink.createPageRenderLinkWithContext(MyImage.class, parameter);
}
}
あとは、tml で次のリンクを使用するだけです。
<img src="${imageLink}" />
明らかに、パラメーターと取得を結び付ける必要があります。