Dieser Artikel hat Ihnen zwei Möglichkeiten zum Hochladen und Herunterladen von Java FTP -Dateien für Ihre Referenz geteilt. Der spezifische Inhalt ist wie folgt
Die erste Methode:
Paket com.cloudpower @Title: ftp.java* @author: zhou lingbin*/public class ftp {/*** Lokaler Dateiname*/private String LocalFileName; / *** Remote -Dateiname*/ private Zeichenfolge remoteFileName; / *** FTP -Client*/ privat ftpclient ftpclient; /** * Server connection* @param ip Server IP * @param port Server port* @param user user name* @param password Password* @param path Server path* @author Zhou Lingbin* @date 2012-7-11 */ public void connectServer(String ip, int port, String user, String password, String path) { try { /* *******Two methods to connect to the server*******/ //The first Methode // ftpclient = new ftpclient (); // ftpclient.openServer (IP, Port); // die zweite Methode ftpclient = new ftpclient (IP); ftpclient.login (Benutzer, Passwort); // auf binäre Übertragung ftpclient.binary () einstellen; System.out.println ("Anmelderfolg!"); if (path.length ()! } ftpclient.bary (); } catch (ioException ex) {ex.printstacktrace (); neue runimeexception (ex) werfen; }} / *** Schließen Sie die Verbindung* @Author Zhou Lingbin* @date 2012-7-11* / public void Closeconnect () {try {ftpclient.closesServer (); System.out.println ("Erfolg trennen"); } catch (ioException ex) {System.out.println ("nicht trennen"); ex.printstacktrace (); neue runimeexception (ex) werfen; }} / *** Datei hochladen* @param Localfile Local Datei* @param remoteFile Remote-Datei* @Author Zhou lingbin* @date 2012-7-11* / public void Upload (String LocalFile, String RemoteFile) {this.LocalFileName = localFile; this.remoteFileName = remoteFile; TavetoutputStream OS = NULL; FileInputStream ist = null; Versuchen Sie {// die Remotedatei zum Ausgabestream OS = ftpclient.put (this.remoteFileName) hinzufügen; // Erhalten Sie den Eingabestream der lokalen Dateidatei_in = neue Datei (this.localFileName); is = new FileInputStream (Datei_in); // Erstellen Sie ein Puffer -Byte [] bytes = neues Byte [1024]; int c; while ((c = is.read (bytes))! = -1) {os.write (bytes, 0, c); } System.out.println ("Erfolg hochladen"); } catch (ioException ex) {System.out.println ("nicht hochladen"); ex.printstacktrace (); neue runimeexception (ex) werfen; } endlich {try {if (is! = null) {is.close (); }} catch (ioException e) {e.printstacktrace (); } endlich {try {if (os! = null) {os.close (); }} catch (ioException e) {e.printstacktrace (); }}}} / ** * Datei herunterladen * @param remoteFile Remote-Dateipfad (Serverseite) * @param Localfile Local Dateipfad (Client) * @Author Zhou LingBin * @date 2012-7-11 * / public void download (String RemoteFile, String LocalFile) {telNetinputStream is = null; FileOutputStream OS = NULL; Versuchen Sie es mit {// den Dateinamen auf dem Remote -Computer und verwenden Sie TelnetInputStream, um die Datei in den lokalen Bereich zu übertragen. is = ftpclient.get (remoteFile); Datei Datei_in = neue Datei (localFile); os = new FileOutputStream (Datei_in); byte [] bytes = neues byte [1024]; int c; while ((c = is.read (bytes))! = -1) {os.write (bytes, 0, c); } System.out.println ("Erfolg herunterladen"); } catch (ioException ex) {System.out.println ("nicht download"); ex.printstacktrace (); neue runimeexception (ex) werfen; } endlich {try {if (is! = null) {is.close (); }} catch (ioException e) {e.printstacktrace (); } endlich {try {if (os! = null) {os.close (); }} catch (ioException e) {e.printstacktrace (); }}}} public static void main (String agrs []) {String filepath [] = {"/temp/aa.txt", "/temp/regist.log"}; String localFilePath [] = {"c: //tmp//1.txt", "c: //tmp//2.log"}; Ftp fu = new ftp (); /** Verwenden Sie die Standard -Portnummer, den Benutzernamen, das Kennwort und das Root -Verzeichnis, um eine Verbindung zum FTP -Server herzustellen // Download für (int i = 0; i <filepath.length; i ++) {fu.download (filepath [i], localFilepath [i]); } String localFile = "e: //number.txt"; String remoteFile = "/temp/haha.txt"; // fu.upload (localFile, remoteFile) hochladen; fu.closeconnect (); }}
Über diese Methode gibt es nichts zu sagen, sie ist relativ einfach und es gibt kein Problem des chinesischen verstümmelten Code. Es scheint, dass es einen Fehler gibt und keine großen Dateien betreiben kann. Interessierte Freunde können es versuchen.
Die zweite Methode:
public class ftpapche {private static ftpclient ftpclient = new ftpclient (); private statische Zeichenfolge coding = system.getProperty ("file.encoding"); /** * Beschreibung: Laden Sie die Datei auf den FTP -Server hoch * * @Version1.0 * @param url * ftp Server Hostname * @param port * FTP -Server -Port * @param userername * ftp login -Konto * @param Passwort * ftp login Passwort * @param path * FTP -Server speichert das Direktory. FTP -Server * @param Eingabe * Lokaler Dateieingabestream * @return Return TRUE SELTRAG, Ansonsten Falsch */ public static boolean UploadFile (String -URL, int Port, String -Benutzername, String -Kennwort, String -Pfad, String -Dateiname, InputStream -Eingabe) {boolean result = false; Versuchen Sie {int Antwort; // Wenn der Standardport verwendet wird, können Sie direkt eine Verbindung zum FTP Server ftpclient.connect (URL) herstellen. // ftp.connect (URL, Port); // Verbindung zum FTP -Server herstellen // Melden Sie sich bei FTPClient.login (Benutzername, Kennwort) an; ftpclient.setControlencoding (codieren); // Überprüfen Sie, ob die Verbindung erfolgreich ist Reply = ftpclient.getReplyCode (); if (! ftpreply.ispositiveCompletion (Antwort)) {System.out.println ("Verbindung fehlgeschlagen"); ftpclient.disconnect (); Rückgabeergebnis; } // Übertragen Sie das Arbeitsverzeichnis in das angegebene Verzeichnis boolean change = ftpclient.changeworkingDirectory (Pfad); ftpclient.setFiletype (ftp.Binary_file_type); if (Änderung) {result = ftpclient.storefile (neuer String (Dateiname.getBytes (Codierung), "ISO-8859-1"), Eingabe); if (result) {System.out.println ("erfolgreich hochgeladen!"); }} input.close (); ftpclient.logout (); } catch (ioException e) {e.printstacktrace (); } endlich {if (ftpclient.isconnected ()) {try {ftpclient.disconnect (); } catch (ioException ioe) {}}} return Ergebnis; }/*** Lokale lokale Dateien auf den FTP -Server***/public void testUploadFromDisk () {try {FileInputStream in = new FileInputStream (neue Datei ("e: /Number.txt"); boolean flag = uploadFile ("127.0.0.1", 21, "zlb", "123", "/", "haha.txt", in); System.out.println (Flag); } catch (FilenotFoundException e) {e.printstacktrace (); }} /** * Beschreibung: Datei vom FTP -Server herunterladen * * @Version1.0 * @param url * FTP Server Hostname * @param Port * FTP -Server -Port * @param userername * ftp login -Konto * @param Passwort * FTP -Login -Passwort * @Param remotepath * relative Path. nach lokal nach dem download * @return */ public static boolean downfile (String -URL, int Port, String -Benutzername, String -Kennwort, String remotepath, String -Dateiname, String LocalPath) {boolean result = false; Versuchen Sie {int Antwort; ftpclient.setControlencoding (codieren); / * * Um chinesische Dateien hochzuladen und herunterzuladen, empfehlen einige Orte, die folgenden zwei Sätze anstelle von * neuer String (remotepath.getBytes (Codierung), "ISO-8859-1") Transcodieren zu verwenden. * Nach dem Test kann es nicht übergeben werden. */// ftpclientConfig conf = new ftpclientConfig (ftpclientConfig.Syst_nt); // Conf.SetServerLuGuageCode ("Zh"); ftpclient.connect (URL, Port); // Wenn der Standardport verwendet wird, können Sie direkt eine Verbindung zum FTP -Server mit ftpclient.login (Benutzername, Kennwort); // Login // Setzen Sie den Dateiübertragungsart auf binäre ftpclient.setFiletype (ftpclient.berary_file_type) her; // Erhalten Sie den FTP -Anmeldesantwortcode Reply = ftpclient.getReplyCode (); // Überprüfen Sie, ob das Anmeldung erfolgreich ist, wenn (! Ftpreply.ispositiveCompletion (Antwort)) {ftpclient.disconnect (); System.err.println ("FTP -Server verweigerte Verbindung."); Rückgabeergebnis; } // Übertragen Sie in das FTP-Serververzeichnis in das angegebene Verzeichnis ftpclient.changeworkingDirectory (neuer String (remotepath.getBytes (codieren), "ISO-8859-1")); // Die Dateiliste ftpfile [] fs = ftpclient.listfiles () abrufen; für (ftpfile ff: fs) {if (ff.getName (). Equals (Dateiname)) {Datei localFile = new Datei (LocalPath + "/" + ff.getName ()); OutputStream ist = new FileOutputStream (localFile); ftpclient.retrieveFile (ff.getName (), IS); IS.CLOSE (); }} ftpclient.logout (); Ergebnis = wahr; } catch (ioException e) {e.printstacktrace (); } endlich {if (ftpclient.isconnected ()) {try {ftpclient.disconnect (); } catch (ioException ioe) {}}} return Ergebnis; }/** * Laden Sie die Datei auf dem FTP -Server auf die lokale herunter * */public void testdownfile () {try {boolean flag = downfile ("127.0.0.1", 21, "zlb", "123", "/", "haha.txt", "d:/"); System.out.println (Flag); } catch (Ausnahme e) {e.printstacktrace (); }} public static void main (String [] args) {ftpapche fa = new ftpapche (); fa.testdownfile (); }}
Auf diese Weise müssen Sie auf das Problem des chinesischen verstümmelten Code achten. Wenn Sie es falsch einstellen, ist der Name des hochgeladenen Dateins möglicherweise verstümmelt. Manchmal kann es überhaupt nicht hochgeladen werden. Natürlich werden Sie Sie nicht auffordern, weil es keine Ausnahme gibt. Ich habe viele Lösungen online gefunden und es gibt viele verschiedene Meinungen. Fast alle von ihnen wurden aus einer Version kopiert, und ich wurde nicht von mir selbst getestet. Ich habe viel dafür gelitten. Es ist grob in die folgenden zwei Lösungen unterteilt:
1. Fügen Sie die folgenden drei Sätze hinzu, um es zu lösen
ftpclient.setControlencoding ("gbk");
FtpclientConfig conf = new ftpclientConfig (ftpclientConfig.Syst_nt);
Conf.SetServerluageCode ("Zh");
Antwort: Nach dem Testen funktioniert es einfach nicht, das obige Problem besteht immer noch
2. Es ähnelt der obigen Methode, aber ich denke, diese Methode ist zuverlässiger
Fügen Sie zunächst den Satz ftpclient.setControlencoding ("gbk") hinzu; Und dann transkodieren Sie alle Chinesen in das Format "ISO-8859-1", wie folgt:
ftpclient.ChangeworkingDirectory (neuer String (remotepath.getBytes ("gbk"), "ISO-8859-1"));
Antwort: Nach dem Test funktioniert es immer noch nicht. Der Grund, warum ich sagte, dass diese Methode zuverlässiger ist. Bitte lesen Sie weiter.
Lassen Sie uns zunächst darüber sprechen, warum wir transkodieren müssen:
Da im FTP-Protokoll der Dateiname als ISO-8859-1 codiert wird, muss der Verzeichnisname oder der Dateiname transkodiert werden.
Die nächste Frage ist, welche Codierung wir in dieses Format konvertieren sollten. Daher gibt es eine zweite Lösung, die das GBK-Format in das ISO-8859-1-Format umwandelt. Darüber hinaus sagen einige Leute auch, dass dies getan werden muss. Tatsächlich denke ich, dass der Grund, warum sie sagen können, dass dies ein völliger Zufall ist. Sein reales Prinzip ist, dass wir, da das vom FTP-Protokoll angegebene Codierungsformat "ISO-8859-1" ist, das Format wirklich konvertieren und dann automatisch in das eigene Codierungsformat des Systems konvertiert werden, wenn der Server die Datei empfängt. Daher ist der Schlüssel nicht, das Format anzugeben, sondern vom Codierungsformat des FTP -Servers abhängig zu sein. Wenn das Codierungsformat des FTP -Systems "GBK" ist, wird die zweite Methode definitiv erfolgreich sein. Wenn das Codierungsformat des Systems jedoch "UTF-8" ist, gibt es immer noch ein verstümmelter Code. Daher können wir nur das Codierungsformat des Systems über den Code erhalten und es dann durch dieses Codierungsformat in das Codierungsformat von ISO-8859-1 konvertieren. Die Erfassungsmethode lautet wie folgt:
private statische Zeichenfolge coding = system.getProperty ("file.encoding");
Alle oben genannten Codes wurden von sich selbst getestet. Ich hoffe, sie können das Problem für alle lösen!