2012-03-01 58 views
11
不渲染streamedcontent

我使用streamedcontent呈現從JSF發送一個字節,然後發回的流媒體內容如下:graphicImage的在Primefaces

<p:graphicImage value="#{manage.bytesToStreamedContent(car.image)}"/> 

其中圖像是存儲在圖像的字節數組數據庫

支持bean:

public StreamedContent bytesToStreamedContent(byte[] bytes) 
{ 
    InputStream is = new ByteArrayInputStream(bytes); 
    StreamedContent image = new DefaultStreamedContent (is, "image/jpeg"); 
    return image; 
} 

但我沒有得到在JSF頁面圖像。我得到這條消息出現在服務器日誌中:

警告:JSF1091:文件dynamiccontent中找不到MIME類型。要解決此問題,請將mime-type映射添加到應用程序web.xml。

和:

SEVERE: Error in streaming dynamic resource. 

可以請你幫我在這裏,我不能找到有關這個問題的任何有用的信息

PS:

進出口使用以下庫:

Mojarra 2.1.3

PrimeFaces 3.1.1

Glassfish 3.1

+0

可能重複(http://stackoverflow.com/questions/10073905/problems-displaying-database-blob-image-in -primefaces-graphicimage) – BalusC 2013-06-27 11:49:57

+0

相關/重複問題:http://stackoverflow.com/questions/8207325/display-image-from-database-with-pgraphicimage/,http://stackoverflow.com/questions/10073905/problems-顯示數據庫blob圖像在primefaces-graphicimage,http://stackoverflow.com/questions/10944673/how-to-use-pgraphicimage-with-defaultstreamedcontent-in-an-uirepeat/,http:// stackoverflow .com/questions/8304967/how-to-use-pgraphicimage-with-streamedcontent-within-pdatatable/ – BalusC 2013-06-27 11:51:03

+1

@BalusC但這篇文章比你提到的一些「相關」問題還要舊! – fareed 2013-06-27 16:35:59

回答

10

找到問題所在。問題不在於圖像。這是因爲graphicimage標籤是動態加載的(在嘗試從數據表加載時出現類似的問題)。動態圖像不能直接在數據表或數據網格中呈現。 (解決方法是分配一個參數並從ID中提取圖像)。

然而,該解決方案是here

[在Primefaces graphicImage的顯示數據庫團塊圖像問題]的
3

一般來說,在獲取graphimage的getter中創建StreamedContent並不是一個好主意。該圖像將從其餘內容的單獨請求中提取,這意味着取決於迭代器的變量將不起作用。這意味着在對bytesToStreamedContent的相關調用中,bytes數組將爲null/empty。如果在方法內部放置斷點,您可能會看到在最後一次調用中沒有以字節爲單位的數據。

您需要確保在您仍然可以訪問所有需要的內容的同時生成映像,然後將其以bytesToStreamedContent方式再次檢索。如果沒有看到代碼的其餘部分,這個問題是否會解決問題並且真正爲你工作是很難說的。我會開始試圖刪除字節數組參數並返回一個靜態圖像,以確認這是問題。

+0

字節首先來自數據庫並傳遞給JSF。然後從JSF發送請求以顯示爲流式內容來查看圖像。但是,我試圖從應用程序sourceFiles中將該文件作爲輸入流讀取,併爲streamedContent創建了一個添加,但仍然沒有渲染。最後,我試圖直接從靜態源獲取文件,如下所示: 並且這次它成功呈現。你怎麼看? – fareed 2012-03-02 14:47:57

+0

如果使用像InputStream is = new FileInputStream(「C:\ images \ lemontree.jpg」);沒有幫助,我真的不知道什麼是錯的。我主要關心的是car.image參數沒有按照您的想法工作。 – MatsT 2012-03-05 10:06:13

4

這是一個奇怪的問題,我不認爲將mime-type添加到web.xml會解決它。它被列爲既是一個錯誤在PrimeFaces與目標爲3.2

http://code.google.com/p/primefaces/issues/detail?id=3546

而且它也被列爲鑽嘴魚科2.1.1開放的錯誤。有一個補丁提交了這個bug,但它看起來像你將不得不手動將代碼應用到Mojarra 2.1.1源代碼並構建它。人們會認爲這將在2.1.3中得到解決,然而,Glassfish可能有自己的預先捆綁的Mojarra實現,它仍然處於較早的版本,您的應用程序可能會使用它。

http://java.net/jira/browse/JAVASERVERFACES-2103

編輯:

可以只是直接傳遞的字節[]作爲參數傳遞給這樣的方法。你可以做的事情是將汽車的id作爲參數傳遞,然後檢索該汽車並從Car實體中獲取字節。原因是因爲實際上呈現爲HTML img標記,這發生在來自JSF頁面請求的單獨HTTP請求中。下載並安裝適用於Firefox的Firebug插件,您將看到發生這種情況,請求頁面,然後在檢索頁面後爲圖像發生後續請求。由於這種ViewScoped和RequestScoped bean不能以這種方式訪問​​,但是仍然可以傳遞一個請求參數,並提供檢索圖像的Car字節所需的必要信息。

<p:graphicImage value="#{manage.bytesToStreamedContent}"> 
<f:param name="item_id" value="#{car.id}" /> 
</p:graphicImage> 

現在在您的託管bean屬性中,您可以獲取車輛ID,獲取車輛ID後,您應該能夠找到合適的車輛。

public StreamedContent getBytesToStreamedContent() { 
    String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("item_id"); 
    //Now get the car with the id 
} 
+1

那麼我有什麼選擇將我的字節數組作爲圖像顯示在jsf頁面上? – fareed 2012-03-02 21:13:26

+2

@ ed See請參閱上面對我的回答的編輯。我認爲也許你可能會錯誤地使用graphicImage。 – 2012-03-03 02:49:16

+1

我嘗試了你在這裏提出的建議,但我得到了同樣的結果。我也嘗試通過直接從支持bean傳遞一個定義的字符串來獲取圖像,並且Im獲取相同的東西,而不是呈現。真的堅持這一個 – fareed 2012-03-03 14:26:21

相關問題