2017-02-23 11 views
0

私は、Spring 4 + JSF 2.0フレームワーク+ MySQLデータベースを使用してWebサイトを開発しています。 私はデータベースから画像を取得してブラウザに表示しようとしています。 だから、基本的に私は、画像と呼ばれるLongBlob列を持つproduct_tというテーブルを持っています。これはpngファイルを格納する責任があります。Spring + JSF - データベースからのイメージ取得とブラウザーでの表示

私は、ページ内の各製品から各画像を取得する必要があります。

<ui:repeat value="#{productControllerImpl.list3NotNewRandomProducts()} var="product" varStatus="status"> 
<h2>#{product.name}</h2> 
<strong>#{product.subDescription}</strong><br></br> <span>#{product.description} 
</ui:repeat> 

これまでのところは良いです。

私は画像を取得するためにサーブレットを呼び出す必要がUIの各製品の場合:

私はGoogleで、次の解決策を検索します。 は、私はJSF +春を使用していたように、私はUIに次のブロックのコードを書いた:

<h:graphicImage value="/images/#{productControllerImpl.findProductImageById(product.id)}"/> 

をそして、私のproductControllerImplに私はこれがあります。

@Override 
public byte[] findProductImageById(Long productId) { 
    byte[] productImage = null; 
    HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();  
    ServletOutputStream outputStream = null; 
    try { 
     productImage = productService.findProductImageById(productId); 
     response.reset();   
     outputStream = response.getOutputStream(); 
     response.setContentType("image/png"); 
     outputStream.write(productImage); 
     outputStream.flush();  
     outputStream.close(); 
    } catch(Throwable e){ 
     throw new RuntimeException("Error processing product image: " + e.getMessage(), e); 
    } 

    return null; 
} 

だから、基本的に私は、反復からproducItを受け付けておりますが、データベース上でそれぞれの製品イメージを検索します(これが最善の選択であるかどうかわかりません)。

このページにアクセスしたときにここでの問題は、私は、ブラウザで完全なイメージを受け、次のとおりです。

Product Image

そして私はかなりこの部分に迷ってしまいました。

私がここで紛失しているものは誰か知っていますか?

ありがとうございます。

答えて

0

私はあなたが私はあなたの主な問題は、あなたの応答ストリーム終了していると信じているShow image as byte[] from database as graphic image in JSF page

に言及していると仮定: outputStream.flushを();
outputStream.close(); それらを削除し、イメージサーブレット用のdoGetで再度試してください。ここではむしろ、コンテンツを出力するサーブレットを作成するよりもDisplay dynamic image from database with p:graphicImage and StreamedContent

またはOmniFaces graphicImageはhttp://showcase.omnifaces.org/components/graphicImageを述べたように

は個人的に私はPrimeFacesでStreamedContentを好みます。 Servlet for serving static content

+0

こんにちはVeernarM:

BalusCによるこの投稿は、すべてのあなたの問題を解決します。 あなたのお手伝いをよろしくお願いします。 outputStream.flush()を削除しようとしました。 outputStream.close(); しかし、結果は同じです。 =(StreamedContentについては 、それはPrimeFacesライブラリである、と私のアプリケーションは、単に画像を表示するために、これらすべてのprimefacesライブラリと非常に重くなります。 私はOminiFacesを使用しようとしましたが、それが唯一のJava CDIで動作します。=( ブラウザで画像が全画面表示されるのはなぜですか? – THIAGORC

+0

おそらくCSS /ページエラーとして表示するxhtmlページをさらに追加し、サーブレットとは関係ないと思うでしょう。 – VeenarM

+0

私は以下のアプローチでこれを解決できました: 私のプロジェクトにApache Commons Codecの依存関係を追加しました。 そしてDTOにはBase64.encodeBase64Stringによって返される文字列を追加した: productDTO.setImage(Base64.encodeBase64String(productT.getImage()))。 productT.getImage()は、データベースからのBLOBデータであるbyte []を返します。 私のxhtmlでは、 タグでも動作します)というタグを追加しました。 問題は解決しました。 ありがとう誰もがこのソリューションが同じ問題を持つ他の開発者を助けることを願っています。 =) – THIAGORC

関連する問題