Tomcat: Binary aus DB lesen und an Browser/Client senden
Hallo, bei mir läuft ein Tomcat 5.X und J2EE 1.5_6. Mit org.apache.commons.io habe ich es geschafft Dateien hochzuladen und diese in eine Datenbank zu speichern. Nun habe ich das Problem, dass ich diese Dateien von wieder von Clients runterladen lassen möchte - PDF, DOC,JPG, ... es gibt alle möglichen Dateitypen, welche ich zu den Clients senden möchte. Aus der DB habe ich den Longblob ausgelesen und davon einen InputStream erzeugt. [code] java.sql.ResultSet rsf = myOne.getFile(request.getParameter("fid")); while (rsf.next()) { java.io.InputStream is = rsf.getBinaryStream("file"); File f = new File("/home/tow/" + rsf.getString("fname")); FileInputStream fis = new FileInputStream(f); } [/code] Wie kann ich nun den "is"/BinaryBlob an den Client senden? Mit response.getOutputStream() bekomme ich einen OutputStream auf den ich schreiben kann. Wenn möglich möchte ich angeben können um welchen Datei-Typ es sich handelt, damit auf dem Client das entsprechende Programm geöffnet werden kann. Das müsste doch mit setContentType(String type) gemacht werden können?? Daraus resultier mein Lösungsansatz (funktioniert leider nicht) ... mit setContentType den ContentType setzen. Dann den OutputStream holen und Byte für Byte vom InputStream lesen und in den OutputStream schreiben. Wie geht das? Da mache ich wohl irgendetwas falsch ... falls es so funktioniert. Ich bin für jeden Tipp dankbar! :-) tia und schöne Grüße Oli
Hi, habe jetzt das Schicken der Datei hinbekommen. 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. Hier mein jetziger Code: 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. Mit welcher Methode kann ich das einstellen? Oder braucht der setHeader Name einen bestimmten Wert? Falls ja, welchen? tia Oli Am Dienstag 23 Mai 2006 18:21 schrieb Tim Oliver Wagner:
Hallo, bei mir läuft ein Tomcat 5.X und J2EE 1.5_6. ....
Hallo Tim Oliver, hallo Leute, Am Dienstag, 23. Mai 2006 23:34 schrieb Tim Oliver Wagner:
habe jetzt das Schicken der Datei hinbekommen. Leider ist nun noch der vorgeschlagene Name (zum lokalen Speichern) falsch. Wie kann ich das bereinigen?
In PHP sieht das so aus: header("Content-Disposition: attachment; filename=$filename"); Die Umsetzung zu Java sollte nicht allzu schwer sein ;-) Allerdings gibt es bei diesem Header scheinbar ein paar Browser-Bugs, siehe dazu den letzten Abschnitt von 13.3. Wie realisiere ich einen Dateidownload mit PHP? http://www.php-faq.de/q/q-datei-download.html Gruß Christian Boltz --
[HD mit badblocks] NACK, es kommt immer auf den Anwendungszweck an. Für ein Lern- / Experimentiersystem lohnt sich keine neue HD, solange es zu funktionieren scheint. Experimente auf welchem Sektor? Spanabhebende Storage-Lösungen? [> Al Bogner und Thomas Dreher in suse-linux]
Am Mittwoch 24 Mai 2006 19:18 schrieb Christian Boltz:
Hallo Tim Oliver, hallo Leute,
Am Dienstag, 23. Mai 2006 23:34 schrieb Tim Oliver Wagner:
Allerdings gibt es bei diesem Header scheinbar ein paar Browser-Bugs, siehe dazu den letzten Abschnitt von 13.3. Wie realisiere ich einen Dateidownload mit PHP? http://www.php-faq.de/q/q-datei-download.html
Hallo Christian, vielen Dank für Deine Mail. Bei diesem Bug scheint mein Problem wirklich die Ursache zu haben. Jetzt weiss ich wenigstens bescheid. Sonst hätte ich wahrscheinlich noch ewig alle möglichen Kombinationen ausprobiert ... Merci und noch einen schönen Sonntag Oli
participants (2)
-
Christian Boltz
-
Tim Oliver Wagner