# Tomcat -> Binary aus DB lesen und an Browser/Client sende



## nauni77 (23. Mai 2006)

Hallo,
hier läuft ein Tomcat 5.X und j2ee 1.5_6.

Ich habe mit org.apache.commons.io es geschafft Dateien hochzuladen und diese in eine Datenbank zu speichern. Nun habe ich das Problem, dass ich diese Dateien nun wieder von Clients runterladen lassen möchte - PDF, DOC, JPG ... es gibt alle möglichen Dateitypen, welche ich zu den Clients senden möchte.

Ich habe bereits das Longblob aus der Datenbank ausgelesen und einen InputStream davon:


```
ResultSet rs = meineFunktionDieDasRSAbholt();
while (rs.next) {
  java.io.InputStream is = rs.getBinaryStream("file");
  // Jetzt muss ich diesen Stream an den Client schicken ... aber wie???
}
```

Wie kann ich nun "is" an den Client schicken?? Ich suche heute schon den ganzen Tag nach der Lösung - hoffe einer von Euch kann mir weiterhelfen. Das wäre super.

Bei PHP gab es eine Funktion die das erledigt hat. Hoffe soetwas gibt es beim Tomcat (J2EE) auch. Leider finde ich diese Methode nicht. :-(

Vielen Dank im Voraus und schöne Grüße

Oli


----------



## bronks (23. Mai 2006)

Evtl. geht das so direkt:


```
response.getOutputStream().write(is);
```


----------



## nauni77 (23. Mai 2006)

Hi,
mit hilfe des Tipps habe jetzt das Schicken der Datei hinbekommen. Vielen Dank! Musste lediglich noch einige Übergabewerte abändern. Weiter unten steht wie es funktioniert hat.  Leider ist es noch nicht 100% gelöst.

Leider ist nun noch der vorgeschlagene Name (zum lokalen Speichern) falsch. Wie kann ich das bereinigen?

Im Moment nimmt der Browser den Namen der Datei die vom Browser aufgerufen wurde. Also die JavaServerPage: xyz.jsp.


```
java.sql.ResultSet rsf = myOne.getFile(request.getParameter("fid"));
while (rsf.next()) {
	int b;
	
	response.setContentType(rsf.getString("contentType"));
	java.io.InputStream is = rsf.getBinaryStream("file");
	OutputStream os = response.getOutputStream();
	while ((b = is.read()) != -1) {
		os.write(b);
	}
	os.close();		
}
```

Wie kann ich hier den vorgeschlagenen Namen einstellen? Mit setHeader(String name, String value) passiert nichts ... hoffe es kennt jemand von Euch die Lösung hierzu. Also mit welcher Methode kann ich den "zu speichern unter Namen" einstellen?

tia

Oli


----------



## Guest (24. Mai 2006)

```
response.setHeader("Content-Disposition","attachment; filename=\"Name.Erweiterung\"");
```


----------



## nauni77 (24. Mai 2006)

Hallo,
danke für den Hinweis. Ich habe den "Content-Disposition"-Header wie im vorherigen Posting gesetzt. Wenn ich nun im Browser für den Link "speichern unter" wähle, dann kommt leider nicht der dort angegebene Name.

Desweiteren habe ich es mit "inline" anstatt attachment versucht. Oder einfach nur mit "filename="xyz.abc". Leider alles ohne Erfolg. :-(


```
response.setHeader("Content-Disposition", "attachment: filename=\"xyz.abc\"");
```

habe ich direkt hinter 


```
response.setContentType(rsf.getString("contentType"));
```

gesetzt.

Ich habe es mit Firefox und dem Konqueror versucht. Beider schlagen noch das jsp, welches aufgerufen wird zum senden der Datei, als Namen vor.

Hoffe es kann mir jemand sagen woran das liegt.

tia

Oli


----------



## Guest (24. Mai 2006)

Semikolon statt Doppelpunkt hinter inline bzw. attachment, dann sollte es gehen.


----------



## nauni77 (24. Mai 2006)

Hi,
habe es auch mit ";" versucht. Leider ohne Erfolg. Zudem habe ich aus Verzweiflung folgende Header hinzugefügt:


```
request.setHeader("Pragma", "no-cache");
request.setHeader("Expires", "0");
request.setHeader("Content-Disposition", "attachment; filename=\"abc.xyz\"");
```

Eigentlich verhindern diese nur ein hinterlegen der Datei im Cache.

Woran könnte es noch liegen? Ich habe keine Ideen mehr.  :bahnhof: 

tia

Oli


----------



## Guest (24. Mai 2006)

Browsercache leeren vielleicht. IE ist ein Messie. 
Wenn es immer noch nicht geht, dann weiss ich nichts mehr.


----------



## nauni77 (25. Mai 2006)

Hi,
leider liegt es nicht daran. Danke trotzdem für den Tipp! Ab und zu liegt es wirklich an solchen Kleinigkeiten die in diesem Moment einfach nicht beachtet werden.

Hoffe es hat noch jemand einen Tipp für mich.

tia

Oli


----------



## clemson (25. Mai 2006)

ich hab das so gelöst


```
int MAX_AGE_IN_SECONDS = 600; // maximale wartezeit in sekunden
...
response.setContentLength(file.length());
response.setContentType("application/x-file-download");
response.setHeader("Content-disposition", "attachment; filename=abc.exe");
response.setHeader("Cache-Control", "max-age="+ MAX_AGE_IN_SECONDS);
...
// stream der datei auf den outputstream des response schreiben...
```


und da hab ich noch eine beispiel applikation (allerdings in struts), welche streams aus einer datenbank zum download bereit stellt --> strutsblobapp


----------

