我已经在db中保存了blob图像,使用这个component我希望将mysql中的blob嵌入到tapestry中的标记中。 我在网上找到了this。 不明白writer.element是如何工作的
我认为这样的事情应该有效
@SupportsInformalParameters
public class DBImage {
@Parameter(required = true)
private Image image;
@Inject
private ComponentResources resources;
boolean beginRender(MarkupWriter writer,byte[] array){
writer.element("img", "src", "data:image/png;base64,"+array,);
resources.renderInformalParameters(writer);
writer.end();
return false;
}
}
每次在页面类上调用组件
@Property
private DBImage image.beginRedner(entity.getBlobImage);
答案 0 :(得分:3)
我没有尝试将data uri scheme用于挂毯中的图像 - 我确信它“可以”起作用,但要打电话给你,只需将它包含在你的tml中:
<t:DBImage image="${entity.BlobImage}" />
在您的DBImage组件中,您需要一种方法将image
参数转换为字节数组。
我不想花时间创建这种技术的工作示例,但我将带您了解如何解决此类问题:
就像html文档中的任何图像渲染一样,必须有两个单独的请求(除非使用数据uri方案):
http://host/context/app/mypage
)http://host/context/app/myimage
)因此对于请求1,您需要构建图像URL并将其放在img标记中:
<html>
...
<img src="/context/app/myimage/params" />
...
</html>
并且请求2只返回图像数据的字节流。
让我们从第二个请求开始,因为它更有意义。
在tapestry中,通过创建页面类和可选的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)
{}
};
}
}
此时,您可以使用网址“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}" />
显然,您需要连接参数和检索。