powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Есть нормальные библиотеки для работы с ftp?
7 сообщений из 7, страница 1 из 1
Есть нормальные библиотеки для работы с ftp?
    #38571200
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробовал apache commons net 3.3. Не понравилось.
Не умеет правильно работать с кодировками. (Не правильно считывает имена файлов на русском. Я могу, конечно, их принудительно перекодировать. Но мне не нравится такое решение.).
И тупо не качает.

Может быть я что то делаю не так..
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
package testftp;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import static java.lang.System.out;
import static java.nio.file.Files.copy;
import static java.nio.file.Files.createDirectory;
import static java.nio.file.Files.exists;
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;

public class TestFtp {

    private static final String //
            SERVER = "127.0.0.1",
            USER = "Andrei",
            PASS = "qw",
            FTP_FOLDER = "/public/rank2/";
//            SERVER = "127.0.0.1",
//            USER = "anonymous",
//            PASS = "",
//            FTP_FOLDER = "/pub/Windows/internet/";
    //
    private static final int //
            PORT = 2121;
//            PORT = 21;

    public static void main(String[] args) throws IOException {
        FTPClient ftpClient = new FTPClient();
        ftpClient.connect(SERVER, PORT);
        try {
            ftpClient.login(USER, PASS);
            try {
//                ftpClient.enterLocalPassiveMode();
                out.println("Connected");
                TestFtp testFtp = new TestFtp(ftpClient);

                testFtp.downloadDirectory(FTP_FOLDER, Paths.get("D:\\test"));
            } finally {
                ftpClient.logout();
            }
        } finally {
            ftpClient.disconnect();
        }

    }

    private final FTPClient ftpClient;
    public TestFtp(FTPClient ftpClient) {
        this.ftpClient = ftpClient;
    }

    public void downloadDirectory(String dirFtp, Path dirLocal) throws IOException {
        for (FTPFile ftpFile : ftpClient.listFiles(dirFtp)) {
            String fileName = ftpFile.getName();
            if (equalsWithAny(fileName, ".", "..")) {
                continue;
            }

            String subPathFtp = dirFtp + "/" + fileName;
            Path subPathLocal = dirLocal.resolve(fileName);

            if (ftpFile.isDirectory()) {
                if (!exists(subPathLocal)) {
                    createDirectory(subPathLocal);
                }
                downloadDirectory(subPathFtp, subPathLocal);
            } else {
                try (BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(subPathLocal.toFile()))) {
                    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
                    ftpClient.retrieveFile(dirFtp, os);
                }
                //
                //
//                try (InputStream is = ftpClient.retrieveFileStream(subPathFtp)) {
//                    if (is != null) {
//                        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
//                        copy(is, subPathLocal, REPLACE_EXISTING);
//                    }
//                }
            }
        }
    }

    public static boolean equalsWithAny(String s, String... someStrings) {
        for (String aString : someStrings) {
            if (s.equals(aString)) {
                return true;
            }
        }
        return false;
    }
}

...
Рейтинг: 0 / 0
Есть нормальные библиотеки для работы с ftp?
    #38572032
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ftp и файлы на русском - оксюморон.

P.S. Нет, есть конечно расширение, но какое-то оно замороченное-замороченное ...
...
Рейтинг: 0 / 0
Есть нормальные библиотеки для работы с ftp?
    #38572040
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mk,

Код: java
1.
ftpClient.setControlEncoding() 
...
Рейтинг: 0 / 0
Есть нормальные библиотеки для работы с ftp?
    #38572139
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz
Код: java
1.
ftpClient.setControlEncoding()


Стало по-русски. Только для каждого сервера свою кодировку нужно ставить. Увы не панацея, нужно в рантайме определять в какой кодировке отдаёт имена файлов сервер.

2ая проблема осталась.
...
Рейтинг: 0 / 0
Есть нормальные библиотеки для работы с ftp?
    #38572151
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mk,

Там на самом деле не всё так просто. Либо ASCII, либо UTF-8, либо кривой сервер.
https://wiki.filezilla-project.org/Character_Set
https://tools.ietf.org/html/rfc2640

FTP протокол не содержит информации об используемых кодировках, поэтому определить их не предоставляется возможным. Можно только дать пользователю выбор. Либо пробовать самостоятельно анализировать текст, подбирая кодировку. Такие инструменты тоже есть.
...
Рейтинг: 0 / 0
Есть нормальные библиотеки для работы с ftp?
    #38572153
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На счет "тупо не качает", надо тупо смотреть лог всех FTP сообщений.
...
Рейтинг: 0 / 0
Есть нормальные библиотеки для работы с ftp?
    #38572211
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Тупо не качает", вполне возможно, банальное "и клиент и сервер за файерволом, но файервол сервера не умеет пассивный режим ftp".
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Есть нормальные библиотеки для работы с ftp?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]