# Bild von Datenbank in jsp anzeigen



## MisterG (14. Nov 2007)

Hallo Forum-Mitglieder

Ich habe in einer Datenbank ein Blob-Feld mit Bildern als Inhalt. Nun möchte ich diese in einer jsp anzeigen lassen. Bei der Forensuche habe ich nur diesen Beitrag gefunden.
Ist das die einzige Möglichkeit? Ich verstehe den Code nicht wirklich.

Habe einfach noch keinen richtigen Ansatz finden können, wo ich beginnen soll. Gibts irgend ein Tutorial oder weiss jemand einen guten Suchbegriff?

Ich bin für jede Hilfe, Ratschlag und Hinweis Dankbar.

Mit freundlichen Grüssen,
MisterG


----------



## ARadauer (14. Nov 2007)

hab letze woche sowas gemacht, hab aber ein servlet benutzt.

so ungefähr:

rs ist ein ResultSet und image ist ein BufferedImage 

```
Blob imageBlob =rs.getBlob("BLOBBILD");
InputStream is = imageBlob.getBinaryStream();
image = ImageIO.read(is);
```


```
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
...		
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response.getOutputStream());
encoder.encode(imageFromDb.getImage());
...
```

imageFromDb.getImage() liefert das BufferedImage zurück

funktioniert super, tu mir jetzt leider schwer, ein ganzes beispiel zu zeigen, da die ganze angelegenheit in ein framework eingebttet habe und alles auf ein paar klassen verteilt ist.

wie weit bist du bereits, poste mal code vielleicht kann ich dir dann besser helfen.


----------



## MisterG (14. Nov 2007)

Hallo ARadauer


```
<%query = "SELECT PIC FROM TABELLE WHERE PICID=2";
ResultSet rs = stmt.executeQuery(query);
if (rs.next()){
	Blob data = rs.getBlob(1);
	InputStream is = data.getBinaryStream();%>
	

[img]<%=ImageIO.read(is)%>[/img]</img></p>
<%}%>
```

So habe ich es jetzt probiert (funktioniert noch nicht). Den zweiten Code-Schnippsel von dir habe ich nicht verstanden was ich mit dem machen muss.


----------



## ARadauer (15. Nov 2007)

versuch mal das ganze zu trennen.
eine jsp die das bild lädt und eine in der es angezeigt wird

<img src = "bild.jsp">

und in der bild.jsp, dann sowas


```
<%
response.setContentType("image/jpeg");

query = "SELECT PIC FROM TABELLE WHERE PICID=2"; 
ResultSet rs = stmt.executeQuery(query); 
if (rs.next()){ 
   Blob data = rs.getBlob(1); 
   InputStream is = data.getBinaryStream();
    BufferedImage image = ImageIO.read(is); 
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response.getOutputStream()); 
    encoder.encode(imageFromDb.getImage());
}
%>
```

oder so (das hab ich nicht getestet)

```
<%
response.setContentType("image/jpg");
if (rs.next()){ 
   Blob data = rs.getBlob(1); 
   InputStream is = data.getBinaryStream();
   BufferedImage image = ImageIO.read(is); 	

    Iterator writers = ImageIO.getImageWritersByFormatName("jpg");
    ImageWriter writer = (ImageWriter)writers.next();
    ImageOutputStream ios = ImageIO.createImageOutputStream(response.getOutputStream());
    writer.setOutput(ios);
    writer.write(image );
    ios.close();
}
%>
```

für die browswer der <img src = "bild.jsp"> aufruft, muss es praktisch so aussehen als kommt ein bild daher (response.setContentType("image/jpg")


----------



## maki (15. Nov 2007)

JSP ist eine Darstellungs/Template Technologie, sie ist besser für Textdaten (XML) geeignet, führt oft zu Darstellungsfehlern mit Binärdaten.

Ein Servlet wäre hier der richtige Weg imho.


----------



## MisterG (16. Nov 2007)

Hallo zusammen!

Wenn die bessere Variante mit einem Servlet ist mache ich dies lieber in einem Servlet. Kann ich da den gleichen Code verwenden wie ARadauer dies für das bild.jsp vorgeschlagen hat?

EDIT:
Ich habe nun ein Servlet erstellt. Füge es in der jsp einfach mit <img scr="bild"/> ein.

Mit Variante 1:
Was ist das imageFromDb für ein Objekt?

Mit Variante 2:
Nun habe ich bemerkt, dass image immer ==null ist.
Deswegen wird warscheinlich auch bei der Zeile

```
ImageWriter writer = (ImageWriter)writers.next();
```
immer ein java.util.NoSuchElementException ausgeworfen.

Was soll ich tun?

Gruss
MisterG


----------



## ARadauer (20. Nov 2007)

So jetzt nochmal von Vorne. Die Code Schnipsel sind wahrscheinlich schwer zu verstehen. Aber wie gesagt, einen Teil erledigt mir das firmeninterne Framework und einige Sachen habe ich ausgelagert, jetzt ist meine fertige Lösung etwas zerteilt.

Ich habe es jetzt nochmal in einer JSP zusammen gefasst. Im Grunde ist ja eine jsp datei auch nur ein Servlet. Die Jsp Datei wird vom Compiler, in ein Servlet umgewandelt. Ich hab das Beispiel jetzt aber nochaml in einer jsp Datei nachgebaut. 

Ist vielleicht einfacher, das Servlet müsstest du noch in der web.xml eintragen. usw..... von diesen deployment dingen, habe ich (leider) auch nicht so viel ahnung. wir haben hier eine eigene Abteilung fürs deployment.

Aber egal, also über JSP:

Verwenden tust dus so:







Und hier die image.jsp, also bei mir funktioniert es.



```
<%@page import="java.sql.Connection"%>
<%@page import="com.sun.image.codec.jpeg.JPEGCodec"%>
<%@page import="com.sun.image.codec.jpeg.JPEGImageEncoder"%>
<%@page import="javax.imageio.ImageIO"%>
<%@page import="java.io.InputStream"%>
<%@page import="java.sql.Blob"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.awt.image.BufferedImage"%>

<%
try{
	response.setContentType("image/jpeg"); 
	BufferedImage image;
	Connection connection = null; //verbindung aufbauen!!!
	//zb: connection = DriverManager.getConnection("url", "user", "pwd");
	
	PreparedStatement ps = connection.prepareStatement("SELECT BLOBID, BLOBBILD FROM BLOBTEST WHERE BLOBID = ?");
	ps.setInt(1,5);
	ResultSet rset = ps.executeQuery();
	if (rset.next()) {
		Blob imageBlob =rset.getBlob("BLOBBILD");
		InputStream is = imageBlob.getBinaryStream();
		image = ImageIO.read(is);
		JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response.getOutputStream());
		encoder.encode(image);
	}
} catch (Exception e) {
	e.printStackTrace();
}	

%>
```

Paramter Übergabe usw.. darfst dir selber machen.


----------



## MisterG (20. Nov 2007)

Juhuu, es funktioniert!

Vielen herzlichen Dank!

Ich schrieb ja, dass ich immer image == null habe. Das lag daran, weil ich die Bilder als bmp in der Datenbank hatte. Nun mit png klappt es.

Zuerst bekam ich noch Exceptions zurück, das hat sich aber mit der Wechsel ins Servlet erledigt.

Das PreparedStatement Objekt kannte ich noch nicht, werde ich mir sicher für die Zukunft merken.

Es war sehr lehrreich. Noch einmal vielen Dank für die Hilfe.

MisterG


----------

