1

我已将 blob 图像保存在 db 中,使用此组件我希望将 blob 从 mysql 嵌入到挂毯中。我在网上找到了这个。不明白 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);
4

1 回答 1

3

我没有尝试将数据 uri 方案与挂毯中的图像一起使用 - 我确信它“可以”工作,但要调用你只需将其包含在你的 tml 中:

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

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

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

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

  1. 页面的 html 来呈现图像标签(即http://host/context/app/mypage
  2. 图像数据(即http://host/context/app/myimage

所以对于请求一,您要构建图像 url 并将其放在 img 标签中:

<html>
...
<img src="/context/app/myimage/params" />
...
</html>

请求二将只返回图像数据的字节流。

让我们从第二个请求开始,因为这样更有意义。

在 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)
            {}
        };
    }
}

此时,您可以使用 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}" />

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

于 2012-11-04T21:26:05.727 回答