34

JBoss 7.1.1 で PrimeFaces 3.2 を使用しています。

の MySQL データベースの BLOB に保存されている画像を表示しようとしています<ui:repeat>。イメージは に格納され、次のようbyte[]に に変換さStreamedContentれます。

InputStream stream = new ByteArrayInputStream(ingredient.getImage());
ingredient.setJsfImage(new DefaultStreamedContent(stream, "image/jpg"));

次に、次のように Facelet に表示しようとしています。

<ui:repeat var="ingredient" value="#{formBean.ingredientResultSet}">
    <p:panel id="resultsPanel" header="#{ingredient.location.shopName}">
        <p:graphicImage value="#{ingredient.jsfImage}" alt="No picture set" />
...

ただし、ページをロードすると、JBoss で次のエラーが発生します。

SEVERE [org.primefaces.application.PrimeResourceHandler] (http--127.0.0.1-8080-12) 動的リソースのストリーミング中にエラーが発生しました。

これはどのように発生し、どうすれば解決できますか?

4

6 に答える 6

57

は、取得した HTML マークアップを解析して結果を表示しようとしているときに、後で Web ブラウザーによって個別に呼び出される URL だけで要素を<p:graphicImage>実際にレンダリングすることを理解する必要があります。<img src>

そのため、getter メソッドで何を行うにしても、<p:graphicImage>リクエストごとに呼び出すことができるように設計する必要があります。したがって、最も健全なアプローチは、 が完全にスタンドアロンのリクエストまたはアプリケーション スコープの Bean をポイントし (したがって、ビューまたはセッション スコープがまったくない)、一意のイメージ識別子をポイントするを作成<p:graphicImage>することです。<f:param><p:graphicImage value><f:param value>

例えば

<p:graphicImage value="#{images.image}">
    <f:param name="id" value="#{someBean.imageId}" />
</p:graphicImage>

バッキングImagesBean は次のようになります。

@Named
@ApplicationScoped
public class Images {

    @EJB
    private ImageService service;

    public StreamedContent getImage() throws IOException {
        FacesContext context = FacesContext.getCurrentInstance();

        if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
            // So, we're rendering the view. Return a stub StreamedContent so that it will generate right URL.
            return new DefaultStreamedContent();
        }
        else {
            // So, browser is requesting the image. Return a real StreamedContent with the image bytes.
            String id = context.getExternalContext().getRequestParameterMap().get("id");
            Image image = service.find(Long.valueOf(id));
            return new DefaultStreamedContent(new ByteArrayInputStream(image.getBytes()));
        }
    }

}

または、すでにOmniFaces 2.0 以降<o:graphicImage>を使用している場合は、代わりに、より直感的に、ほぼ期待どおりに使用できるものを使用することを検討してください。この件に関するブログも参照してください。

以下も参照してください。

于 2012-04-15T12:07:28.580 に答える
3

BalusCさん、ありがとうございます。バッキング Bean で整数を定義し、画像の ByteArray を更新するときに異なる値を割り当てることで、このことを行いました。この整数は、画像の一意の識別子として機能します。<f:param>次に、この整数をページ内の値として設定<p:graphicImage>します。

画像タグは次のようになります

 <p:graphicImage value="#{empBean.image}">
    <f:param name="id" value="#{empBean.imageId}" />
  </p:graphicImage>`

バッキングBeanの画像を次のように設定します

 if(user.getPicture()!=null){
        imageId = (int) new Date().getTime();
        BinaryStreamImpl bs = new BinaryStreamImpl(user.getPicture());  
//picture is byte[] property in user class      
        this.image =   new DefaultStreamedContent(bs.getInputStream(), "image/png");
    }

今はうまくいっています。

于 2015-09-02T13:00:49.333 に答える
3

なぜこれが必要なのかわかりません。マッピング「/images/yourimage.jpg」を使用して、データベースから画像を取得するサーブレットを作成できます。

これを行う方法について、対応するコードを含む簡単なチュートリアルを次に示します。

JSF - データベースからの画像を JSF で表示する

于 2012-04-17T14:10:03.407 に答える
1

graphicImageコンポーネントがページ上で何をレンダリングするかを覚えておく必要があります。<img>HTML要素にレンダリングされます。ブラウザーでは、JSF ページに対して要求が行われ、その後、ページ上の各画像に対しても後続の要求が発生します。

これらの画像は、FacesServlet ではなく PrimeFaces リソース サーブレットからのものです。つまり、マネージド Bean のスコープとそのプロパティはおそらく適用されません。

最初にブロブをバイト配列にロードしてみてください。そうすれば、おそらく機能し始めます。

編集:この同様の質問に対する次の回答を参照してください。 グラフィックイメージが Primefaces でストリーミングコンテンツをレンダリングしない

于 2012-04-09T15:32:50.567 に答える
0
InputStream is = new ByteArrayInputStream((byte[]) yourBlobData);
myImage = new DefaultStreamedContent(is, "image/png");

jsfページで;

<p:graphicImage value="#{controller.myImage}" style="width:200px;width:500px" />
于 2014-02-19T09:15:22.890 に答える
-2

<p:graphicImageうーん、99% ui:repeat では動作しないと確信しています。これには多くの問題があります (XD を実行したため)。サーブレットを作成し、画像を入力ストリームとして提供することをお勧めします (多くの例があります)。そこの)。

于 2012-04-14T18:22:29.013 に答える