2010-12-29 17 views
18

Ich arbeite gerade an einer GWT-basierten Website. Jetzt bin ich fest, wie ich Bilder in einer Datenbank auf meiner Website anzeigen sollte.GWT - Bild aus der Datenbank

Grundsätzlich habe ich ein Bytearray in meiner Datenbank, die ich mit Hibernate abrufen. Jetzt soll ich wahrscheinlich einen ... Tag aus diesen Daten erstellen, aber ich weiß nicht, wie

ich GWT in Java bin mit und Hibernate

+7

+1 .. weil jeder gwt Entwickler wird über dieses Problem kommen. –

Antwort

11

Hier ist die Lösung. Zuerst sollten Sie das Byte-Array mithilfe von com.google.gwt.user.server.Base64Utils.toBase64 (byte []) codieren. Aber diese Methode funktioniert nicht für IE 7. und IE8 hat 32kb Grenze .. IE9 hat dieses Limit nicht.

hier ist die Methode auf dem Server

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

Hier wird die Client-Methode ist;

+0

Ich muss das ausprobieren.Danke – Hons

+0

Was ist "Bild" bedeutet (was Tag ist das) in diesem Aufruf RootPanel.get ("Bild"); und wie man das gleiche in uibinders und action dispatch macht. – Bennet

+0

@Bennet 'image' hier ist die ID des div-Tags, das in der HTML-Seite des gwt-Projekts erstellt wurde. –

1

Es gibt Image Widget in GWT. Sie können es nicht clientseitig tun, aber Sie können RPC anrufen, um mit dem Server zu kommunizieren. Dann ist es eine einfache CRUD-Anwendung. In Server-Datenbank mit Hibernate verbinden und das Bild an den Client zurückgeben oder es ist url und auf der Client-Seite tut etwas wie die:

@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()); 
} 

Das ist alles. Happy coding

+0

Okay, ich wusste von diesem Widget, aber es erfordert eine URL, die ich nicht habe, da es ein Bild in einem DB – Hons

+0

ist, sollten Sie es bekommen und speichern Sie die Festplatte (getBLOB) geben Sie dann die URL zum Bild . Ansonsten denke ich, dass man das Bild nicht zeigen kann, ohne es auf die Platte zu übertragen –

+0

> Ich denke, man kann das Bild nicht zeigen, ohne es auf die Platte zu kopieren - Ja, man kann das Bild zeigen, ohne es zu kopieren Scheibe. Alles, was Sie tun müssen, ist, Blob zurück zur Benutzeroberfläche zu bringen. – ch4nd4n

4

Ich weiß nicht, wie GWT funktioniert, obwohl Sie einen Servlet/Controller zuordnen können, der ResourceStream zurückgibt. Zum Beispiel, wenn Sie ein Servlet „Imageviewer“ Karte, die imageId param nimmt würde, fordern zu Bild würde Bezug auf den Blob haben

/imageViewer?imageId=1234 

Hibernate Objekt geworden, so dass Sie, dass zurückkehren können. Referenz auf UI würde

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

-Update sein: Sie können nicht in der Lage sein Modell zu verwenden, wie es Bild zurückzukehren, würden Sie einen expliziten Controller oder Servlet benötigen, die Stream-Daten zurückgibt.
In Servlet würden Sie so etwas wie

// 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

Das scheint ziemlich vernünftig zu sein. In einer "normalen" JSP oder PHP oder einer anderen Homepage müsste man auch so etwas machen. Oder? – Hons

+0

Sie können Anfrage von "Browser", unabhängig von Ansicht/Templating-Technologie. Es ist eine einfache HTTP-Anfrage. Es sollte auch Ajax funktionieren. – ch4nd4n

+0

Ein tolles Balusc-Tutorial zum Servieren von Bildern durch Servlets: http://balusc.blogspot.com/2007/04/imageservlet.html Dieser Ansatz funktioniert auch mit Image-Widget –

1

ich den gleichen Ansatz tun, die als Gürsel Koca vorgeschlagen, aber nur den Apache Base64-Bibliothek, nicht (ironischerweise) die GWT Base64Utils

String base64 = Base64.encodeBase64String(array); 
base64 = "data:image/"+type+";base64," + base64; 
return base64; 
arbeiten konnte

beachten Sie auch, dass, wenn Sie ein vorhandenes Bild oder ein Bild Platzhalter aktualisieren, wird die setURL Methode Ihr Stylesheet überschreiben, so stellen Sie sicher, dass die erste greifen:

String styleName = profilePicture.getStyleName(); 
profilePicture.setUrl(base64String); 
profilePicture.setStyleName(styleName);