Apache Commons Net enthält FTPHTTPClient für FTP über einen HTTP-CONNECT-Proxy. Seine nützliche Eigenschaft ist nicht nur das Erreichen des FTP-Login-Ports: Er baut auch Proxy-Tunnel für die passiven Datenverbindungen auf, die Auflistungen und Dateiübertragungen verwenden.

Der Konstruktor nimmt den Proxy-Endpunkt und optionale Proxy-Anmeldedaten entgegen. Der FTP-Server bleibt das Argument für connect, und login erhält das FTP-Konto:

FTPHTTPClient ftp = new FTPHTTPClient(
    "proxy.example.net", 8080, proxyUser, proxyPassword
);

try {
    ftp.connect("ftp.example.net", 21);
    if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
        throw new IOException(ftp.getReplyString());
    }
    if (!ftp.login(ftpUser, ftpPassword)) {
        throw new IOException(ftp.getReplyString());
    }

    ftp.enterLocalPassiveMode();
    if (!ftp.setFileType(FTP.BINARY_FILE_TYPE)
            || !ftp.retrieveFile(remoteFile, output)) {
        throw new IOException(ftp.getReplyString());
    }
    ftp.logout();
} finally {
    if (ftp.isConnected()) {
        ftp.disconnect();
    }
}

Dieses Übertragungsfragment setzt die FTP-Importe von Commons Net, java.io.IOException, von der Anwendung bereitgestellte Anmeldedaten-Variablen und einen Ausgabestream im Besitz des Aufrufers voraus. remoteFile ist der vorgesehene Dateiname auf Serverseite. Die Anwendung muss außerdem ihren Ausgabestream zum passenden Zeitpunkt schließen.

Setzen Sie den passiven Modus nach dem Verbinden und vor einem Datenvorgang. Die Implementierung von FTPHTTPClient lehnt Datenverbindungen im aktiven Modus ab. Im passiven Modus handelt sie den Daten-Endpunkt mit FTP aus und öffnet eine weitere Verbindung zum HTTP-Proxy, dann fordert sie einen CONNECT-Tunnel zu diesem Endpunkt an.

Dieser zweite Tunnel erklärt eine häufige Grenze: Die Proxy-Berechtigung für den FTP-Steuerport reicht nicht aus. Die erlaubten Ziele und Ports müssen die passiven Daten-Endpunkte des Servers einschließen. Eine erfolgreiche Begrüßung und Anmeldung beweisen nur, dass die Steuerroute funktioniert hat.

Die Implementierung liefert Basic-Proxy-Authentifizierung, wenn sowohl Proxy-Benutzername als auch Passwort vorhanden sind. Das unterscheidet sich vom FTP-USER/PASS-Austausch. Ein Proxy, der einen anderen Authentifizierungsmechanismus verlangt, benötigt einen kompatiblen Connector; der Konstruktor macht nicht jedes Verfahren verfügbar.

Commons Net dokumentiert diese Klasse als experimentell, daher sollten Sie sie vor der Übernahme an den Anforderungen der Anwendung und des Proxys messen. Sie ist ein FTP-Client, kein FTPS- oder SFTP-Client. Für FTPS mit einem verfügbaren SOCKS-Dienst ist die Socket-Proxy-Schnittstelle von FTPSClient ein separater Client-Pfad. CONNECT stellt die Route bereit und verschlüsselt nicht selbst FTP-Anmeldedaten oder Dateiinhalte.

Halten Sie Fehler an der Stufe fest, die sie verursacht hat: eine HTTP-Ablehnung beim Tunnelaufbau, eine verweigerte FTP-Anmeldung oder ein FTP-/Datenübertragungsfehler. Das Ersetzen des FTP-Passworts kann eine Proxy-Richtlinie, die den passiven Datenport ablehnt, nicht lösen.

Ähnliche Artikel