# Servlet - Datei auf Server speichern und Ausgabe



## Johnny (23. Feb 2005)

Hallo!

Also ich habe folgendes Problem und zwar bei der Ausgabe eines Bildes in einem Servlet. Die erste Methode unten soll ein Bild von meiner Datenbank einlesen und auf der Festplatte speichern (eigentlich will ich es auf dem TomcatServer speichern, aber wo und wie (relativ) speichert man Daten von einem Servlet auf Tomcat?). Jedenfalls schreibt die Methode ein File in den Pfad den ich bestimmt habe. Die Datei hat auch die genau die selbe Größe. Nur, man kann sie sich nicht anzeigen lassen (mit Grafikprogrammen). Wenn man sich die Datei mit dem Texteditor anschaut, sind die ersten und letzten Zeichen gleich. Nachher habe ich allerdings gesehen, daß die Breite des gespeicherten Bildes von der des Originals abweicht - ist etwas kleiner - hat jemand vielleicht eine Idee, worauf das zurückzuführen ist?. Ich nehme an, daß das der Grund ist für die Probleme beim Anzeigen.  Ps: Die Bildausgabe mit dem PrintWriter, also ohne abspeichern in eine Datei, statt dem FileWriter funktioniert tadelos.

Und mein zweites Problem (das aber sicher einfach ist) - mit der zweiten Methode möchte ich dann das Bild anzeigen - ist klar, wenn ich eines nehme, das nicht funktioniert, daß dann nichts angezeigt wird, aber der Code funktioniert auch nicht, wenn ich "funktionierendes Bild nehme.

Danke im voraus 

johnny



```
public void retrievedRsToFileonServer(PrintWriter out, ResultSet rs, String colName) throws SQLException, IOException
		{
				
			if(rs.next())
			{
			
			InputStream in = rs.getBinaryStream(colName);
			
			BufferedInputStream bis =  new BufferedInputStream(in);
			
			
			File f = new File("C:\\Dokumente und Einstellungen\\All Users\\Dokumente\\Programme\\Tomcat 4.1\\server\\webapps\\manager\\serverSavePlace\\hor.gif");
			
			FileWriter fw = new FileWriter(f);
			BufferedWriter bw = new BufferedWriter(fw);
			
			
			//out.println(f.getAbsolutePath());
		
			
					
			
			int c;
			while((c = (int)bis.read())!=-1)
			{
					
					bw.write(c);		
					
			}

			bis.close();
			bw.flush();
			bw.close();
	
		}
				
					
	}
		
	public void pictureDisplay(PrintWriter pw)
	{
		res.setContentType("text/html");
		pw.write("<img src = \"C:\\Dokumente und Einstellungen\\All Users\\Dokumente\\Programme\\Tomcat 4.1\\server\\webapps\\manager\\serverSavePlace\\hor.gif\">a</img>");
		
		
	}
```


----------



## bambi (23. Feb 2005)

Hi, hab' gerade mal ein wenig rumgespielt: bei mir laeuft's mit

```
<img src = "H:\picsTest\minus.bmp">
```
Es laeuft aber nur auf dem MSIE - bei Firefox bekomme ich auch kein Bild angezeigt. 
Welchen Browser hast Du? Versuch's mal mit IE...

Muesste aber doch gehen, oder? Mit Firefox bekomme ich mit absoluter Pfadangabe keine Ausgabe
 - mit relativer iss alles kein Problem... Merkwuerdig, merkwuerdig - mach ich was falsch
(hab' meherere Varianten getestet - auch "/", ...) ?!?!  :bahnhof: 

Warum nimmst Du nicht 'ne relative Pfadangabe - iss doch eh meistens besser - 
besonders wenn's dann auf den Server kommt...


----------



## Bleiglanz (23. Feb 2005)

Arbeite beim File mit context.getRealPath("/") und beim image mit src = \"../serverSavePlace/hor.gif\"

=> alles soll relativ sein, damit deine Webapp auch mal woanders läuft, der "absolute Pfad" sollte nirgends auftauchen

UND

```
FileWriter fw = new FileWriter(f);
         BufferedWriter bw = new BufferedWriter(fw);
```
du darfst für binäre Daten keinen Writer nehmen! der macht deine daten kaputt!! lies die API java.io.*


----------



## johnny (23. Feb 2005)

Hallo!

Danke - das mit dem Bild in Datei schreiben funktioniert jetzt bei mir  dank einem FileOutputStream tadellos. Nur mit dem relativen Speichern hats mich. Was ist context (muß ich das gleichnamige Interface implementieren) für ein Objekt? Kannst mir das kurz noch etwas genauer erklären?


----------



## meez (23. Feb 2005)

Irgendwie so:



```
ServletContext ctx = super.getServletcontext();
File f = new File(ctx.getRealPath() + "/manager/serverSavePlace/hor.gif");
```


----------



## Johnni (23. Feb 2005)

danke, da war ich vorher eh knapp dran - mich hat nur Context und ServletContext verwirrt und, daß get RealPath noch einen String verlangt... naja jetzt funktioniert jedenfalls das ganze Werkl und mein Firefox zeigts auch an - Danke für die Hilfe


----------

