# Bilder in Java laden und an JSP-Webseite weitergeben



## friscojoe (15. November 2006)

Hallo!

Ich möchte in einer Java-Klasse ein Bild über eine URL laden und dieses Bild dann irgendwie als Stream (oder wie auch immer das funktionieren soll) zurückgeben, so das ich in einer JSP-Seite ein img-tag etwa folgendermassen laden kann:

<img src="<%=MyImageClass.getPicStream("http://server.de/bild1.jpg")%>">

Habe in google sehr lange danach gesucht und man findet auch einiges zu dem Thema, allerdings immer nur für Java-Windows-Anwendungen in awt oder swing. Ich will das Bild ja aber im Web ausgeben und möchte durch die Java-Klasse den gleichen Datenstrom haben, wie als würde man direkt schreiben: 
<img src="http://server.de/bild1.jpg">

Falls sich jemand fragt, warum ich diesen Wahnsinn überhaupt machen will: Wir haben einen Image-Server und einen Webserver auf der selben Maschine laufen, der Webserver natürlich auf Port 80 und der Imageserver auf Port 60. Manche Firewalls (vorallem in Firmen) blocken den Port 60, deswegen können diese Kunden keine Bilder in unserem Shop sehen.

Ich hab schon mehrere Versuche gemacht, aber nichts hat funktioniert.
Hab mir auch das Thema durchgelesen: 
http://www.tutorials.de/forum/java/178911-java-jpeg-laden-verkleinern-speichern.html
aber da wird das Bild ja auch irgendwie anders ausgegeben.

Hab versucht, das Bild ungefähr so zu laden:
ImageOutputStream ios = ImageIO.createImageOutputStream(new URL('pic.jpg'));

oder so:
BufferedImage image = ImageIO.read(new URL('pic.jpg'));

und es dann irgendwie zu übergeben, aber ich denke, ich gehe da schon falsch ran.

Vielleicht weiß ja jemand einen Rat.


Vielen Dank im Vorraus!


----------



## friscojoe (16. November 2006)

...ich stell scheinbar jedesmal in einem Forum die schwersten, unlösbaren Fragen, komisch, frage mich warum das so ist. Habe es mittlerweile selbst hinbekommen, falls jemand auch einmal dieses Problem haben sollte, kommt hier unten die Lösung:

###############################################################

in der HTML-Seite das Bild so laden:

```
<img src="viewImage.jsp?picURL=bild1.jpg">
```


Inhalt der viewImage.jsp - Seite:

```
<%@ page import="java.awt.*, java.net.*, java.awt.image.*, java.util.*, java.io.*, javax.imageio.*, javax.imageio.stream.*" %><%
  
try {
	
	String picURL = request.getParameter("picURL");
	picURL = "http://imageserver:60/" + picURL + (picURL.indexOf("?")>-1? "&": "?") +"CVT=jpg";
	
	
	BufferedImage bi = ImageIO.read(new URL(picURL));
	
	response.setContentType("image/jpg");
	
	Iterator writers = ImageIO.getImageWritersByFormatName("jpg");
	ImageWriter writer = (ImageWriter)writers.next();
	ImageOutputStream ios = ImageIO.createImageOutputStream(response.getOutputStream());
	writer.setOutput(ios);
	writer.write(bi);
	ios.close();
	
	if(out!=null) return;
	
} catch(Exception e) {
	e.printStackTrace();
}
```


Thema kann geschlossen werden!


----------



## Kuba (16. August 2010)

Danke für deine Lösung,

mir hat Sie nach einem Tag suchen endlich zum Durchbruch verholfen.
Ich lade Bilder vom Server, um sie in den jsp-seiten anzuzeigen.


```
<%@ page import="java.awt.*, java.net.*, java.awt.image.*, java.util.*, java.io.*, javax.imageio.*, javax.imageio.stream.*" %><%
  
try {
    
    String sourceFile ="C:/bilder/bild.jpg";
    File file = new File(sourceFile);
    BufferedImage bi = ImageIO.read(file);
    
    response.setContentType("image/jpg");
    
    Iterator writers = ImageIO.getImageWritersByFormatName("jpg");
    ImageWriter writer = (ImageWriter)writers.next();
    ImageOutputStream ios = ImageIO.createImageOutputStream(response.getOutputStream());
    writer.setOutput(ios);
    writer.write(bi);
    ios.close();
    
    if(out!=null) return;
    
} catch(Exception e) {
    e.printStackTrace();
}
%>
```


----------



## schnuffie (16. August 2010)

Für solche Zwecke nutze ich öfters normale Servlets (z.B. Download-Servlet). In dem liest Du per FileInputStream ein File und schreibst es gleich in den ServletOutputStream. Deine JSP-Variante wird ja sinngemäß auch zum Servlet kompiliert. In Deiner (Text-)JSP nimmst Du dann den Link zu dem Servlet auf.


----------



## Kuba (16. August 2010)

Hi schnuffie,

ich bekomme eine IllegalStateException wenn ich folgendes Servlet nutzte:


```
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownloadServlet extends HttpServlet {
	/**
	 * 
	 */
	private static final long serialVersionUID = -2002295296477063727L;
	
	protected void service(
	HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		String sourceFile ="c:/bilder/bild.jpg";
		
		
		ServletOutputStream out = response.getOutputStream();
		
		response.setContentType("image/jpeg");
		File file = new File(sourceFile);
		
		FileInputStream in = new FileInputStream(file);
		byte[] buffer = new byte[16384];
		int bytes = 0;
		
		while ((bytes = in.read(buffer))>0){
			out.write(buffer, 0,bytes);
		}
		in.close();
		
		response.addHeader("Content-Disposition", String.format("inline;filename=%s",file.getName()));
		
		response.flushBuffer();		
	}
}
```

Ich vermute es liegt daran das ich einen FileWriter offen habe in dem Momment in dem ich getOutputStream nutzte. Ich bin leider nicht weitergekommen, daher bin ich ganz froh das es mit dem jsp funktionert.


----------



## Kuba (19. August 2010)

Hallo nochmal,

das Streamen von dem Bild funktioniert jetzt einwandfrei.
Aber jetzt ist unerwartet ein neues Problem aufgetreten.

Da ich das Bild folgendermaßen einbinde:

src="viewImage.jsp" wird das Bild nicht mehr in den Browser-Cache geladen.

Zudem kann ich das Bild über rechte Maustaste ..."speichern unter"  nur als .jsp abspeichern.

Ich hab google zum Thema response.setHeader befragt bzw nach speziellen Tags für das img gesucht, aber ich finde keine Lösung.

Hat jemand eine Idee wie es funktionieren könnte?

MFG
Kuba


----------



## SPiKEe (19. August 2010)

sofern auf dem web-server das sog. auto-indexing aktiviert ist ****t das auch folgendermaßen

neuen ordner erstellen den du z.b. "bild.jpg" nennst ...
in diesen eine index datei *.html .jsp .php was auch immer im auto-index modul definiert ist* und darin den code
an den img-tag übergibst du jetzt nur den ordner
also so : <img src="bild.jpg" /> *ich weis der img-tag ist nicht XHTML-konform* ...
dabei ist auf richtige konfiguration des servers zu achten das dieser auch bei solchen aufrufen nach ordnern sucht und nicht nur nach dateien *denn ordner haben in der regel keine namen mit extension*
jetzt läd der server die index-datei welche dynamisch das bild erzeugt *genau so funktionieren auch diese DEINE IP IST - bilder ...*
da im img-tag die extension angegeben wurde und vom server hoffentlich die richtige antwort mit entsprechdendem header kommt denkt der browser er habe eine normale bild-datei geladen die auch unter ihrer extension speicherbar ist ...
einfach mal n bissl googlen nach begriffen wie : dynamische bilder , auto-indexing und sowas ...
bei selfhtml meine ich das mal schön erklärt gelesen zu haben


----------



## Kuba (19. August 2010)

Hi SPiKEe,

konnte deinen Vorschlag auf Anhieb umsetzten.
Kreative Lösung 

Danke

MFG
Kuba


----------

