使用标记的挂毯显示blob

时间:2012-11-03 20:32:32

标签: image embed blob markup tapestry

我已经在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);

1 个答案:

答案 0 :(得分:3)

我没有尝试将data uri scheme用于挂毯中的图像 - 我确信它“可以”起作用,但要打电话给你,只需将它包含在你的tml中:

<t:DBImage image="${entity.BlobImage}" />

在您的DBImage组件中,您需要一种方法将image参数转换为字节数组。

我不想花时间创建这种技术的工作示例,但我将带您了解如何解决此类问题:

就像html文档中的任何图像渲染一样,必须有两个单独的请求(除非使用数据uri方案):

  1. 页面的html用于呈现图像标记(即http://host/context/app/mypage
  2. 图像数据(即http://host/context/app/myimage
  3. 因此对于请求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}" />
    

    显然,您需要连接参数和检索。