2012-11-03 41 views
1

我已經在db中保存了blob圖像,使用這個component我希望嵌入blob從mysql到掛毯標記。 我在網上找到this。 不明白怎麼writer.element工作使用標記的掛毯顯示blob

我覺得這樣的事情應該工作

@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

http://wiki.apache。org/tapestry/Tapestry5HowToStreamAnExistingBinaryFile鏈接到文檔 – user1516873

回答

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

所以對於一個要求,要構建圖像URL並把它放在一個img標籤:

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

,並要求兩人將只返回圖像數據的字節流。

讓我們從第二個請求開始,因爲這樣做更有意義。

在掛毯中,通過創建頁面類和可選的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://主機/上下文/應用/ MYIMAGE /參數」 渲染圖片。現在你只需要包括這在你的img標籤,即要求1.

所以,你需要首先生成的鏈接,這需要在你的頁面類來完成:

包myproject.pages;

public class MyPage 
{ 
    @Inject 
    private PageRenderLinkSource pageLink; 

    public Link getImageLink() 
    { 
     return pageLink.createPageRenderLinkWithContext(MyImage.class, parameter); 
    } 
} 

所有這就是左邊是使用您的TML此鏈接:

<img src="${imageLink}" /> 

顯然,你需要線了您的參數和檢索。