Mishima
@Mishima

Java Apache FPTS Client. Как победить 425 Can't open data connection при storeFile()?

Доброго времени суток!

Пытаюсь загрузить файл на удаленный FTP через Apache FTPSClient:
InputStream inputStream = new FileInputStream("newFile.txt");
        FTPSClient ftpsClient = new FTPSClient();
        try {

            ftpsClient.connect("hostname");
            ftpsClient.login("username", "password");

            int reply = ftpsClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftpsClient.disconnect();
            }
            
            boolean changed = ftpsClient.changeWorkingDirectory("files/");
            if (!changed) {
                ftpsClient.disconnect();
            }

            ftpsClient.setFileTransferMode(ftpsClient.BINARY_FILE_TYPE);
            ftpsClient.enterLocalPassiveMode();

            boolean stored = ftpsClient.storeFile("newFile.txt", inputStream);
            if (stored) {
                System.out.println();
            }

            ftpsClient.logout();
            ftpsClient.disconnect();

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }


Успешно происходит connect, и смена директории, но не получается выгрузить файл на удаленный FTP.
Когда дело доходит до storeFile - возвращает false, а в replyString самого FTP приходит: 425 Can't open data connection
Файл есть, доступ на удаленный FTP есть. Пробовал заливать через FileZilla и все работает (загрузка/удаление файла).

Читал, что может быть разная обработка PASSIVE MODE, и что у некоторых FTP серверов может не быть, или неправильно работать PASSIVE MODE, но результата так и не достиг.

Подскажите пожалуйста варианты.

P.S. Пробовал также использовать JSch, Session, но не удалось даже подсоединиться (timeout).
  • Вопрос задан
  • 177 просмотров
Пригласить эксперта
Ответы на вопрос 1
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Добрый день.
А подскажите пожалуйста, ведь вроде вы пытаетесь подключиться через FTP, но используете FTPSClient
https://commons.apache.org/proper/commons-net/apid...

Может быть вам нужен FTPClient?
https://commons.apache.org/proper/commons-net/apid...

Могу предположить, что вы пытаетесь подключиться к FTPS, используя порт для FTP (21) и соответственно, возникает ошибка

Вот, например при подключении к FTP у меня все ок:
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPReply;

import java.awt.*;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Main {

    public static void main(String[] args) throws IOException {

        FTPClient ftp = new FTPClient();
        FTPClientConfig config = new FTPClientConfig();
        ftp.configure(config);
        boolean error = false;
        try {
            int reply;
            String host = "example.com";
            ftp.connect(host);
            ftp.login("example_user", "12345");
            System.out.println("Connected to " + host + ".");
            System.out.print(ftp.getReplyString());

            reply = ftp.getReplyCode();

            if(!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                System.err.println("FTP server refused connection.");
                System.exit(1);
            }

            boolean changed = ftp.changeWorkingDirectory("public_html/");
            if (!changed) {
                ftp.disconnect();
            }

            ftp.setFileTransferMode(ftp.BINARY_FILE_TYPE);
            ftp.enterLocalPassiveMode();
            InputStream inputStream = new FileInputStream("/home/admin/Desktop/newFile.txt");
            boolean stored = ftp.storeFile("newFile.txt", inputStream);
            if (stored) {
                System.out.println();
            }

            ftp.logout();
        } catch(IOException e) {
            error = true;
            e.printStackTrace();
        } finally {
            if(ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch(IOException ioe) {
                    // do nothing
                }
            }
            System.exit(error ? 1 : 0);
        }

    }

}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы