# FTP Download zu Client streamen



## franky.b (19. Mrz 2009)

Hallo Leute,

ich stehe vor folgender Aufgabe:

Meine Webapplication (gebaut mit JSF und JBoss Seam, dürfte aber für die Fragestellung keine so große Rolle spielen) läuft auf Server A. Ein Benutzer soll sich über diese Webanwendung eine Datei herunterladen können, die auf einem FTP Server B liegt. 

Wie kriege ich es hin, dass ich diese Datei nicht erst in meiner Anwendung auf den Server A herunterladen muss, bevor ich sie in die Response schreiben kann? Die Datei soll ohne Umweg direkt von FTP-Server an den Client gesendet werden.

Die Webanwendung ist aber für die Authentifizierung am FTP-Server zuständig, d.h. nur ein Redirect auf ftp://server_B/file.txt reicht nicht aus.

Ist so etwas überhaupt möglich? Mir fehlt im Moment irgendwie die zündende Idee oder das richtige Stichwort ???:L

Danke für alle Tipps!:applaus:
Frank


----------



## franky.b (20. Mrz 2009)

Hab ne Menge recherchiert inzwischen, aber immer noch keine Idee 

Hat denn keiner einen Tipp oder sagt mir wenigstens, dass es nicht möglich ist


----------



## Noctarius (20. Mrz 2009)

Versuch mal eine URL Connection, dann den FTP anfragen, InputStream holen und in den OutputStream des Serversocket schreiben


----------



## franky.b (21. Mrz 2009)

So, erstmal danke für den Tipp. An und für sich funktioniert das schon. Der Umweg über meinen Server A ist aber dennoch vorhanden und wie ich mittlerweile rausgefunden habe auch nicht zu vermeiden. 

Code sieht ca. so aus (im doGet des Servlets):

[highlight=Java]

URL url = new URL("ftp://userw@bla.de/Files/test/eclipse.zip;type=i");


        URLConnection urlc = url.openConnection();
        InputStream is = urlc.getInputStream(); // To download


        //write file into response stream.
        try {
            ServletOutputStream os = response.getOutputStream();



            int l;


            byte[] buffer = new byte[8];
            while ((l = is.read(buffer)) != -1)
            {
            os.write(buffer,0,l);


            } 



            os.flush();
            os.close();


[/highlight]

Es gibt jetzt noch ein Problem: die Geschwindigkeit. Nach obiger Implementierung ist es so, dass zuerst die gesamte Datei vom FTP Server gelesen und in die Response geschrieben wird. Erst dann wird die Response an den Client gesendet. Wenn nun die Datei groß ist (es geht um große Dateien, bis zu 5 GB sind möglich), dauert das eine ganze Weile, während der der Client warten muss - der Browser zeigt ein weißes Fenster an, der Benutzer denkt, es passiert eh nichts mehr und macht das Fenster zu.

Daher bin ich schon den ganzen Tag auf der Suche nach einer Möglichkeit, die Datei in mehreren "Stücken" an den Client zurück zu senden. Laut HTTP Spec. geht das mit dem Header 
Transfer-Encoding: chunked

aber leider habe ich es nicht hinbekommen.

Brauche also nochmal einen Tipp 

Gruß,
Frank


----------

