Archiv verlassen und diese Seite im Standarddesign anzeigen : Bild aus Blob in ein File und dann auf die Seite
Hi,
ich habe in einer JSP Seite ein tag, das ein Userobject aus einer Datenbank bezieht (inclusive eines BLOBs). Das BLOB wird in ein File Object umgewandelt. Ein Kind tag soll jetzt das File als ein Bild darstellen. Und da geht's irgendwie nicht weiter... :( .
Hier ein bischen Code fuer's bessere Verstaendnis:
<sbs:userdetails> // das ist das Vater tag, welches ein User Object bereithaelt
<img src='<sbs:picture/>'/> // hier soll irgendwie das Bild hin
</sbs:userdetails>
Das Userobject ist ein Bean, mit einem java.io.File Feld, welches das BLOB aufnimmt
Weis irgend jemand rat ?
wird das file geschrieben, oder kracht's schon vorher?
wenn nicht, dann poste doch mal den auszug, wo du aus dem BLOB das file machst
Erstmal danke fuer die schnelle Antwort :)
Das BLOB wird anstandslos in das File geschrieben:
java.sql.Blob b = rs.getBlob("image");
if(b!=null){
java.io.File f = java.io.File.createTempFile(u.getUsername().replace('.','_'),".jpg");
//if(f.createNewFile()){
java.io.FileOutputStream fos = new java.io.FileOutputStream(f);
fos.write(b.getBytes(1,(int)b.length()));
fos.close();
//}
u.setImage(f);
}
krachen tut's erst wenn ich das File als Byte Stream ausgeben will:
JspWriter out = pageContext.getOut();
if(u.getImage()!=null){
//out.print(u.getImage().getName());
//out.print("../images/"+u.getPictureReference());
String name = u.getImage().getName();
java.io.FileInputStream fis = new java.io.FileInputStream(u.getImage());
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
pageContext.getResponse().getOutputStream().write(buffer); // hier krachts (siehe StackTrace)
}else{
out.print("../images/logo_syntell1.gif");
}
Die Ausnahme sieht so aus:
java.lang.IllegalStateException
at org.apache.jasper.runtime.ServletResponseWrapperInclude.getOutputStream(ServletResponseWrapperInclude.java:109)
at attmontl.pictureTag.otherDoStartTagOperations(pictureTag.java:94)
at attmontl.pictureTag.doStartTag(pictureTag.java:194)...
Der JSPWriter kann ja nur Zeichen ausgeben :mauer:
Weare ich bloss bei Servlets geblieben (nur Spass)
hast du mal das geschriebene temp-file mit nem bildbearb.-prog. geöffnet, um zu sehen, ob's auch wirklich ne richtige datei ist?
beim schreiben auf den response-outputstream hab ich so im hinterkopf, dass vorher auf keinen fall schon irgendwas anderes drauf geschrieben werden sein darf
checke mal ob du vorher IRGENDWAS (und sei es nur ein zeilenumbruch etwa in der form:
<jsp...>
<jsp...> <- da wäre der zeilenubruch vor dem 2. jsp-tag) auf den stream geschrieben hast
Ja, das File wird angelegt und kann auch geoeffnet werden. Ich hab' in einer frueheren Version auch schon mal ein nicht temporaeres File angelegt und dann mit out.print(f.getCanonicalPath()) nur die Referenz in das IMG tag geschrieben. Das hat auch auf meinem Windows Testsystem wunderbar geklappt nur leider?? ist Linux etwas restriktiver als Windows wenn es zu Filesystemzugriffen kommt. Der Tomcat darf das einfach nicht :( und somit gibts kein Bild.
Als ich noch Servlet hard coding betrieben hab' ging das mit dem Bytestream relativ problemlos aber der bloede JspWriter kann nur Zeichenketten :mauer: . Es is zum aus der Haut fahren.
Also ich hab' jetzt einen work around gefunden indem ich das File innerhalb des Webcontainers speichere. Das <img> tag sieht jetzt so aus:
<img src='images/<sbs:picture/>'/>
Also funktionieren tut es sowohl unter Windows als auch Linux.
Was jetzt nervt war natuerlich nicht anders zu erwarten, aber da Browser immer klugscheissen muessen und Bilder cachen, hab' ich jetzt das Problem, dass ein Veraenderung des Bildes erst nach leeren des Browsercaches angezeigt wird :mauer:
Ich glaub ich frag mal im JavaScript Forum nach 'ner Loesung ;)
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.