Laden Sie eine Datei vom FTP-Server in Java hoch
Verwendung von Mit der Apache Commons Net API ist es einfach, ein Programm zum Herunterladen einer Datei von einem FTP-Server zu programmieren. In diesem Artikel erfahren Sie, wie Sie Java-Code richtig implementieren, um Dateien vom Server über das FTP.
Apache Commons Net API und FTP
Die Klasse org.apache.commons.net.ftp.FTPClient bietet zwei Methoden zum Herunterladen von Dateien vom FTP-Server:
1) boolean retrieveFile(String remote, OutputStream local): Diese Methode ruft die Datei vom Server ab, indem sie ihren Pfad im Parameter remote und schreibt die abgerufenen Bytes mit einem OutputStream. Diese Methode gibt true wenn erfolgreich, sonst falsch. Diese Methode eignet sich für unser Programm, wenn Sie die Informationen über die Übertragung und das Speichern der Datei auf der Festplatte nicht kennen müssen. Am Ende des Downloads müssen wir den Ausgabestrom schließen OutputStream am Ende des Downloads.
2) InputStream retrieveFileStream(String remote): Diese Methode nimmt nur den entfernten Dateipfad als Parameter und benötigt keine OutputStream, aber es gibt eine InputStream die zum Lesen der aus der Datei empfangenen Bytes nützlich sein kann. Diese Methode gibt uns mehr Kontrolle darüber, wie Bytes auf den lokalen Datenträger geschrieben werden. Es gibt zwei wichtige Punkte bei der Verwendung dieser Methode:
- Die Methode completePendingCommand() muss aufgerufen werden, um den Download abzuschließen und den zurückgegebenen Wert zu überprüfen, um festzustellen, ob der Download stattgefunden hat.
- Der Wiedergabestream muss geschlossen werden InputStream.
Die Frage ist, welche Methode verwendet werden soll? Hier sind einige Tricks:
- Die erste Methode ist der einfachste Weg, eine Remote-Datei herunterzuladen, indem ein Argument übergeben wird OutputStream der Datei, die wir auf der Festplatte speichern möchten.
- Die zweite Methode gibt uns mehr Kontrolle darüber, wie die Übertragung durchgeführt wird, so dass mehr Code geschrieben werden muss, indem ein InputStream zum Lesen der empfangenen Bytes und eines OutputStream , um die gelesenen Bytes zu speichern. Diese Methode ist nützlich, wenn Sie wissen möchten, wie viele Bytes übertragen wurden und wie viele noch übrig sind. Die Methode completePendingCommand() muss aufgerufen werden , um den Download abzuschließen.
- Beide Methoden lösen eine Ausnahme aus IOException oder eines dieser beiden Ausnahmen: FTPConnectionClosedExcception und CopyStreamException. Stellen Sie daher sicher, dass Sie diese Ausnahmen ordnungsgemäß behandeln, wenn Sie die .
Darüber hinaus müssen die folgenden beiden Methoden vor den Methoden aufgerufen werden retrieveFile() und retrieveFileStream():
- void enterLocalPassiveMode(): Diese Methode ändert den Verbindungsmodus von Server-zu-Client zu Client-zu-Server, wodurch das Problem der Firewall-Sperre vermieden wird.
- void setFileType(int fileType): Diese Methode ändert den Typ der zu übertragenden Datei, es wird empfohlen, den Typ in FTP zu ändern. BINARY_FILE_TYPE und nicht FTP. ASCII_FILE_TYPE auch wenn es sich um eine Textdatei handelt.
Schritte zum Herunterladen einer Datei in Java
Hier sind die Schritte zur ordnungsgemäßen Implementierung des Download-Codes für eine Remote-Datei vom FTP-Server mit der Apache Commons Net:
- Verbinden Sie sich und melden Sie sich beim Server an.
- Verwenden Sie den passiven Verbindungsmodus.
- Ändern Sie den Übertragungstyp in binary.
- Erstellen Sie eine outputStream um die heruntergeladene Datei auf disk.
- Geben Sie den Aufzeichnungspfad zu disk.
- Wenn Sie die Methode retriveFile():
- Pass outputStream und den Dateipfad als arguments.
- Close Write Stream outputStream.
- Lesen Sie den zurückgegebenen Wert, um zu überprüfen, ob der Download erfolgreich war.
- Wenn Sie die Methode retriveFileStream():
- Abrufen auf InputStream Wird von der Methode zurückgegeben retriveFileStream().
- Erstellen Sie ein Byte-Array (Puffer) mit einer festgelegten Größe (normalerweise 4096), um Bytes zu lesen und mit a outputStream.
- Rufen Sie die Methode completePendingCommand() um den Download abzuschließen und den zurückgegebenen Wert zu überprüfen, um festzustellen, ob die Übertragung erfolgreich war.
- Close read and write streams InputStream und outputStream.
- Trennen Sie die Verbindung zum Server mit dem disconnect().
Programm zum Hochladen einer Datei mit FTP in Java
Dieser Code zeigt, wie Sie eine Datei vom FTP-Server mit diesen beiden Methoden herunterladen:- boolean retrieveFile(String remote, InputStream local)
- inputStream retrieveFileStream(String remote)
import java.io.BufferedOutputStream;Die Ausführung dieses Codes zeigt an, dass der Download erfolgreich war:
import java.io.Datei;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
public class FTPDownloadFile {
public static void main(String[] args) {
Server String = "ServerAddress";
int port = 21;
String Benutzername = "IhrBenutzername";
Zeichenfolgenkennwort = "IhrKennwort";
FTPClient ftpClient = new FTPClient();
try {
ftpClient.connect(server, port);
ftpClient.login(Benutzername, Passwort);
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP. BINARY_FILE_TYPE);
// Ansatz 1: Hochladen einer Datei mit InputStream
Datei file = new File("plugins and styles.txt");
String Dateiname = "Plugins und styles.txt";
InputStream inputStream = new FileInputStream(Datei);
System.out.println("Download starten");
//download result
boolean res = ftpClient.storeFile(filename, inputStream);
//schließen Sie den Wiedergabestream
inputStream.close();
if (res==true) {
System.out.println("Die Datei "+Dateiname+
" wurde erfolgreich heruntergeladen");
}
// Ansatz 2: Hochladen einer Datei mit OutputStream
String FileName2 = "Track 2.mp3";
String RemoteFilePath = "/songs/"+Dateiname2;
Datei filelocal = new Datei("C:/Track 2.mp3");
// listet den Ordner auf, in dem sich die Datei befindet, und
// sucht dann nach ihm mit dem zu erhaltenden Namen
// seine Größe, die zur Berechnung verwendet wird
// das Verhältnis des Downloads
FTPFile[] files1 = ftpClient.listFiles("/songs");
lange Größe = 0;
for(int i = 0; Ich< Dateien1.Länge; i++){
if(files1[i].getName().equals(FileName2))
//get file size
size = files1[i].getSize();
}
OutputStream outputStream2 = new BufferedOutputStream(
new FileOutputStream(lokale Datei));
InputStream inputStream2 = ftpClient.retrieveFileStream(
RemoteFilePath);
byte[] bytesArray = neues Byte[4096];
int bytesRead = -1;
//solange wir das Ende noch nicht erreicht haben
int übertragen = 0;
int Prozent = 0;
while ((bytesRead = inputStream2.read(bytesArray)) != -1) {
//Bytes werden an den angegebenen Speicherort geschrieben
outputStream2.write(bytesArray, 0, bytesRead);
weitergeleitet += bytesRead;
Prozent = (int) (übertragen*100/Größe);
System.out.println(percentage+"%");
}
//close write read streams
inputStream2.close();
outputStream2.close();
//br //
res = ftpClient.completePendingCommand();
if (res) {
System.out.println("Die Datei "+Dateiname2+
" wurde erfolgreich heruntergeladen");
}
} catch (IOException e) {
System.out.println(e.getMessage());
e.printStackTrace();
} finally {
try {
if (ftpClient.isConnected()) {
//close FTP
ftpClient.logout();
ftpClient.disconnect();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
Start download
Die Plugins und styles.txt Datei wurden erfolgreich heruntergeladen
Download starten
1%
2%
3%
.
.
98%
99%
99%
100%
2.mp3 Track-Datei wurde erfolgreich heruntergeladen