ich bin gerade dabei eine Klasse zu schreiben welche mehrere Dateien von einem FTP Server runterlädt.
Für den Download vom FTP hab ich eine Methode geschrieben der als Parameter eine Zieldatei und eine Quelldatei (die Datei auf dem Server) übergeben werden.
Wenn ich jetzt die Methode 'download' zum ersten mal aufrufe wird die erste Datei korrekt heruntergeladen.
ABER sobald ich die Methode ein zweites mal aufrufe schlägt der Download fehl. Ich bekomme dann vom ftp
den Code 226 (closing data connection) oder 500 (syntax error).
Ich nehme mal an, dass es etwas damit zu tun hat, dass der Passive Mode beim ersten Download nicht korrekt beendet wird und ich einfach nach beendigung des Downloads noch ein bestimmtes Commando eingeben muss damit der FTP wieder auf das Commando PASV richtig reagiert.
Allerdings bin ich was ftp angeht ein absoluter neuling und komme einfach nicht drauf wo der Fehler liegen könnte. Ich würde mich freuen wenn jemand von euch der da ein bisschen mehr Erfahrung in der richtung hat mir einen kleinen Tipp geben könnte.
Hier erstmal die Methode 'download'
Code:
public File download(File file,String name) throws IOException
{
ftp.sendServer("PASV\r\n");
OutputStream os = new FileOutputStream (file, false);
InputStream is = ftp.get(name);
int len;
byte[] buf = new byte[1024];
while ((len = is.read(buf)) >= 0){
os.write(buf, 0, len);
}
is.close();
os.close();
return file;
}
das weglassen des is.close() hat das Problem nicht beseitigt. Ich denke, dass es möglicherweise daran liegen könnte, dass ich zwei verschiedene Datei Typen nacheinander runterlade. Die erste Datei ist eine normale Textdatei und die zweite eine .gz Datei. Wahrscheinlich muss man beim runterladen mit textdateien anders verfahren als mit anderen Dateitypen.
Ich bekomme bei der zweiten Datei den folgenden Stacktrace:
Code:
sun.net.TelnetProtocolException: misplaced CR in input
at sun.net.TelnetInputStream.read(Unknown Source)
at sun.net.TelnetInputStream.read(Unknown Source)
at sun.net.TelnetInputStream.read(Unknown Source)
at MiniUBS_Update.GUI.download(GUI.java:494)
at MiniUBS_Update.GUI$getFiles.run(GUI.java:346)
at java.lang.Thread.run(Unknown Source)
Das sind natürlich alles nur Vermutungen, da meine Kenntnisse im Bereich ftp nicht besonders gut sind.
ich hab den Fehler gefunden. Je nach Dateityp muss mittels ftp.ascii() bzw. ftp.binary() der richtige Typ eingestellt werden. Soweit ich mitbekommen habe ist der Standard-Dateityp bei einem FtpClient Objekt ascii. Also muss bei
einer .gz Datei vor dem Download auf binary umgestellt werden. (Korrigiert mich bitte wenn das nicht ganz korrekt ist.)
das ist korrect!
jedoch sollte das nicht den fehler verursachen... eine binäre datei, die als ascii übertragen wird, ist fehlerhaft, lässt sich aber normalserweise übertragen... es kann höchstens sein, dass java dann nen anderen Reader verwendet un d desshalb duch die sonderzeichen abschmiert...