Vorwort
Vor kurzem muss ich in meinem Projekt mit dem FTP -Server interagieren. Ich habe eine Tool -Klasse zum Hochladen von FTP im Internet gefunden. Es gibt ungefähr zwei Arten.
Das erste ist eine Singleton -Musterklasse.
Der zweite Typ besteht darin, einen anderen Dienst zu definieren, der das Upload und Download von FTP direkt über den Dienst implementiert.
Beide Gefühle haben Vor- und Nachteile.
Der erste implementiert die Wiederverwendung von Code, aber die Konfigurationsinformationen müssen in der Klasse geschrieben werden, was komplizierter zu pflegen ist.
Der zweite Typ ist ein Spring -Framework, Konfigurationsinformationen können dynamisch über die Eigenschaftendatei injiziert werden, der Code kann jedoch nicht wiederverwendet werden.
Daher habe ich vor, selbst eine Werkzeugklasse zu implementieren, um die beiden oben genannten Vorteile zu integrieren. Übrigens wurden auch einige häufige Probleme während des Upload -Prozesses gelöst.
Da ich das Spring Framework verwende, wenn die Werkzeugklasse als Bean für das Spring -Management deklariert wird, ist es standardmäßig ein Singleton, daher muss ich den Singleton nicht erneut implementieren. Und weil es sich um eine Bohne handelt, kann ich die Eigenschaften der Eigenschaftendatei in die Eigenschaften der Bohne injizieren, um zu entkoppeln. Das Folgende ist der spezifische Code:
Paket com.cky.util; import java.io.file; import Java.io.fileOutputStream; import Java.io.ioxception; import Java.io.inputStream; import Java.io.outputStream; importieren org.apache.net.ftp.ftp.ftp.ftp.ftpclos. org.apache.commons.net.ftp.ftpfile; import org.apache.commons.net.ftp.ftpreply; // Automatische Injektion von @Value ("$ {ftp.host}") privater String -Host; // FTP Server IP @Value ("$ {ftp.port}") privater int port; // FTP Server Port @Value ("$ {ftp.username}") privater String -Benutzername; // Benutzername @value ("$ {ftp.password}") private String -Passwort; // Passwort @value ("$ {ftp.basepath}") privat String Basepath @value Die Datei -Story -Story. in der Hauptmethode hinter dem Code/*public ftputil () {//system.out.println (this.toString ()); Host = "192.168.100.77"; Port = 21; userername = "ftpuser"; password = "ftp54321"; Basepath = "/home/ftpuser/"; }*// **** @param Pfad Der Pfad zum Hochladen der Datei auf den Server* @param Dateiname Dateiname hochladen* @param Eingabeingabe Stream* @return*/ public boolean FileUpload (String -Pfad, String -Dateiname, InputStream -Eingabe) {ftpclient ftp = new ftpclient (); try {ftp.connect (Host, Port); ftp.login (Benutzername, Passwort); // Setzen Sie das Dateicodierungsformat ftp.setControlencoding ("utf-8"); // Es gibt zwei Modi der FTP -Kommunikation // Port (Active Mode) Client öffnet einen neuen Port (> 1024) und sendet Befehle oder überträgt Daten über diesen Port. Während dieses Zeitraums verwendet der Server nur eine Port -IT -Öffnung, z. B. 21 // PASV (Passivemodus) Client sendet einen PASV -Befehl an den Server, der Server öffnet einen neuen Port (> 1024) und verwendet diesen Port, um Daten mit dem Port 21 // aufgrund des unkontrollierbaren Clients, der FireWall usw. zu übertragen, der von dem Server eröffnet wird. // Setzen Sie den Übertragungsmodus auf Stream -Modus ftp.setFileTransferMode (ftp.stream_transfer_mode); // Erhalten Sie den Statuscode, um festzustellen, ob die Verbindung erfolgreich ist, wenn (! Ftpreply.ispositiveCompletion (ftp.getReplyCode ())) {neue RunTimeException ("FTP -Server verweigert zu verbinden"); } // Gehen Sie zum Root -Verzeichnis der hochgeladenen Datei if (! Ftp.changeworkingDirectory (Basepath)) {Neue RunTimeException werfen ("Das Root -Verzeichnis existiert nicht, muss erstellt werden"); } // beurteilen, ob das Verzeichnis existiert, wenn (! Ftp.changeworkingDirectory (Pfad)) {String [] Dirs = path.split ("/"); // Erstellen Sie das Verzeichnis für (String dir: Dirs) {if (null == dir || "". Equals (Dir)) Fortsetzung; // urteilen, ob das Verzeichnis existiert, wenn (! Ftp.changeworkingDirectory (Dir)) {// if (! Ftp.makedirectory (Dir)) {neue runTimeexception ("Subdirektorie -Erstellung fehlgeschlagen"); } // Geben Sie das neu erstellte Verzeichnis ftp.changeworkingDirectory (Dir) ein; }} // Setzen Sie den hochgeladenen Dateityp auf Binärtyp ftp.setFiletype (ftp.berary_file_type); // Die Datei hochladen if (! Ftp.storefile (Dateiname, Eingabe)) {return false; } input.close (); ftp.logout (); zurückkehren; }} catch (Ausnahme E) {neue runTimeException (e) werfen; } endlich {if (ftp.isconnected ()) {try {ftp.disconnect (); } catch (ioException e) {werfen neu runTimeException (e); }}} return false; } /** * * @param Dateiname Dateiname, Hinweis! Der Dateiname hier ist der Dateiname plus Pfad, wie: /2015/06/04/aa.jpg * @param LocalPath Store unter der örtlichen Adresse * @return */public boolean downloadFile (String -Dateiname, String LocalPath) {ftpclient ftp = new ftpclient (); try {ftp.connect (Host, Port); ftp.login (Benutzername, Passwort); // Setzen Sie das Dateicodierungsformat ftp.setControlencoding ("utf-8"); // Es gibt zwei Modi der FTP -Kommunikation // Der Client des Ports (Active Modus) öffnet einen neuen Port (> 1024) und sendet Befehle oder überträgt Daten über diesen Port. In diesem Zeitraum verwendet der Server nur einen Port, den es öffnet, z. ftp.enterLocalPassivemode (); // Setzen Sie den Übertragungsmodus auf Stream -Modus ftp.setFileTransferMode (ftp.stream_transfer_mode); // Erhalten Sie den Statuscode, um festzustellen, ob die Verbindung erfolgreich ist, wenn (! Ftpreply.ispositiveCompletion (ftp.getReplyCode ())) {neue RunTimeException ("FTP -Server verweigert zu verbinden"); } int index = Dateiname.lastIndexof ("/"); // den Pfad des Datei string path = Dateiname.substring (0, Index) abrufen; // den Dateinamen String name = Dateiname.substring (Index+1) abrufen; // beurteilen, ob das Verzeichnis existiert, wenn (! Ftp.changeworkingDirectory (Basepath+Path)) {neue runTimeexception werfen ("Dateipfad existiert nicht:"+Basepath+Pfad); } // Alle Dateien in diesem Verzeichnis ftpfile [] files = ftp.listfiles () abrufen; für (ftpfile Datei: Dateien) {// Beurteilen Sie, ob es eine Zieldatei gibt //system.out.println("file Name "+file.getName ()+" --- "+name); if (file.getName (). Equals (Name)) {//system.out.println("file gefunden "); // Wenn gefunden, kopieren Sie die Zieldatei in die lokale Datei localFile = new Datei (LocalPath+"/"+file.getName ()); OutputStream out = new FileOutputStream (localFile); ftp.retrieveFile (file.getName (), out); out.close (); }} ftp.logout (); zurückkehren; } catch (Ausnahme e) {neue runTimeException (e) werfen; } endlich {if (ftp.isconnected ()) {try {ftp.disconnect (); } catch (ioException e) {werfen neu runTimeException (e); }}}} // Wenn eine der beiden Funktionen verwendet wird prüfen-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- E. printstacktrace (); } endlich {}*/// herunterladen prüfen------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Spezifische Verwendung
Schritt 1: Konfigurieren Sie Feder, um Eigenschaftendateien zu laden
applicationContext.xml
<context:property-placeholder location="classpath:*.properties"/> ftp.propertiesftp.host=192.168.100.77ftp.port=21ftp.username=ftpuserftp.password=ftp54321ftp.basePath=/home/ftpuser/
Schritt 2: Deklarieren Sie die Werkzeugklasse als Bohne
XML -Methode
<bean id = "ftputil"> <Eigenschaft name = "host" value = "$ {ftp.host}"> </property> <Eigenschaft name = "port" value = "$ {ftp.port}"> </Property> <Property name = "userername" value = "$ {{ftp.username}" value = "$ {ftp.password}"> </property> <Eigenschaft name = "basepath" value = "$ {ftp.basepath}"> </property> </bean>Annotationsmethode, Komponentenscanning
<Kontext: Komponenten-scan-Basis-Package = "com.cky.util"> </context: component-scan>
Teil 3: Injektion und Verwendung
@Autowired Private fTputil ftputil;
Zusammenfassen
Das obige ist eine Zusammenfassung des vom Editor eingeführten Spring FTP -Upload- und Download -Toolprobleme. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!