2010-12-29 10 views
18

私は実際にGWTベースのWebサイトで作業しています。 今、私は自分のウェブサイト上のデータベースに保存されている画像をどのように表示するべきかについて悩んでいます。GWT - データベースからのイメージ

基本的に私のデータベースには、ハイバーネイトを使ってフェッチするbytearrayがあります。 は今、私はおそらく、そのデータの中から...タグを作成する必要がありますが、私はJavaでGWTを使用していますか

知っているとGWTでImage Widgetがあり

+7

+1 ..すべてのgwt開発者がこの問題に遭遇するためです。 –

答えて

11

ここに解決策があります。まず、com.google.gwt.user.server.Base64Utils.toBase64(byte [])を使用してバイト配列をエンコードする必要があります。しかし、この方法はIE 7では機能しません。IE8には32 KBの制限があります。IE9にはこの制限がありません。ここ

はここ

public String getImageData(){ 
     String base64 = Base64Utils.toBase64(imageByteArray); 
     base64 = "data:image/png;base64,"+base64; 
     return base64; 
} 

がクライアント方式でサーバー上のメソッドです。

@Override 
public void onSuccess(String imageData) {  
    Image image = new Image(imageData);  
    RootPanel.get("image").add(image); 
} 
+0

私はそれを試してみました。ありがとう – Hons

+0

この呼び出しで "イメージ"とは何(このタグが何であるか)を意味します。RootPanel.get( "image");それをどのようにしてユーバンダとアクション・ディスパッチで行うのか。 – Bennet

+0

@Bennet 'image'はgwtプロジェクトのhtmlページで作成されたdivタグのidです。 –

1

を休止していません。クライアント側ではできませんが、サーバと通信するにはRPCに電話することができます。それは簡単なCRUDアプリケーションです。サーバーでは休止状態でデータベースに接続し、クライアントへのイメージを返すか、それはURLだと、クライアント側でそのような何か:

@Override 
public void onSuccess(String imageUrl) { 
    Image image = new Image(imageUrl); 
    RootPanel.get("image").add(image); 
} 

@Override 
public void onFailure(Throwable caught) { 
    Window.alert(caught.getMessage()); 
} 

すべてです。ハッピーコーディング

+0

さて、私はそのウィジェットについて知っていたが、それはDBの画像であるので、私は持っていないURLが必要です – Hons

+0

あなたはそれを取得し、ディスク(getBLOB)を保存し、 。そうでなければ、ディスクに対処せずにイメージを表示することはできないと思います。 –

+0

>ディスクに対処せずにイメージを表示できないと思います。ディスク。 blobをUIに戻すだけです。 – ch4nd4n

4

resourceStreamを返すサーブレット/コントローラをマップすることはできますが、GWTの仕組みはわかりません。たとえば あなたがサーブレットをマップする場合は、あなたがそれを返すことができるようにIMAGEIDのPARAMを取る「ImageViewerの」、画像への要求がなる

/imageViewer?imageId=1234 

Hibernateのオブジェクトは、BLOBへの参照を持っているでしょう。 UI上の リファレンス

<img src="/imageViewer?imageId=1234"/> 

更新次のようになります。あなたはそれが画像を返すことであるとしてモデルを使用することができないかもしれない、あなたは、ストリームデータを返す明示的なコントローラまたはサーブレットが必要になります。サーブレットで
あなたはGursel Kocaが示唆したように、私は同じアプローチを使用

// get reference to input stream 
InputStream in = hibnerateObject.getImage(); 
// set MIME type etc 
response.setContentType(mimeType); 
OutputStream out = response.getOutputStream(); 
while ((len = in.read(buf)) >= 0) 
out.write(buf, 0, len); 
in.close(); 
out.close(); 
+0

それはかなり妥当であるようです。 「通常の」JSPやPHPなどでは、このようなことをする必要があります。または? – Hons

+0

ビュー/テンプレート技術に関係なく、「ブラウザ」からリクエストできます。その単純なHTTPリクエストです。 Ajaxも同様に動作するはずです。 – ch4nd4n

+0

サーブレットを使って画像を提供することに関する素晴らしいbaluscのチュートリアル: http://balusc.blogspot.com/2007/04/imageservlet.html このアプローチはImageウィジェットでも同様に機能します –

1

ような何かをするだろうが、それだけには(皮肉にも)GWTのBase64Utils

String base64 = Base64.encodeBase64String(array); 
base64 = "data:image/"+type+";base64," + base64; 
return base64; 
のApacheのBase64ライブラリではなく、を使用して動作するように得ることができます

はまた、既存の画像やイメージプレースホルダーを更新する場合は、てsetURLメソッドは、あなたのスタイルシートを上書きするので、その最初をつかむようにしてくださいますのでご注意:

String styleName = profilePicture.getStyleName(); 
profilePicture.setUrl(base64String); 
profilePicture.setStyleName(styleName); 
関連する問題