Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Есть нормальные библиотеки для работы с ftp? / 7 сообщений из 7, страница 1 из 1
25.02.2014, 09:44
    #38571200
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть нормальные библиотеки для работы с ftp?
Попробовал 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
25.02.2014, 17:35
    #38572032
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть нормальные библиотеки для работы с ftp?
ftp и файлы на русском - оксюморон.

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

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


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

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

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

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


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