Почему загрузка по FTP не работает должным образом с Java - PullRequest
0 голосов
/ 08 февраля 2020

В настоящее время я работаю над небольшой программой создания контрольных списков в Java. Я хотел бы загрузить и загрузить созданный файл на мой FTP-сервер (ftps). Я использую следующий код для загрузки:

public static void downloadfile(){
    FTPSClient con = null;

    System.out.println("Download Status: 5%");
    try
    {
        System.out.println("Download Status: 20%");
        con = new FTPSClient();
        con.connect(url);

        if (con.login(user, psw))
        {
            System.out.println("Download Status: 50%");
            con.enterLocalPassiveMode(); // important!
            con.setFileType(FTP.BINARY_FILE_TYPE);
            String data = "E:\\Downloads\\Testdokument.txt";

            OutputStream out = new FileOutputStream(new File(data));
            boolean result = con.retrieveFile("Testdokument.txt", out);
            out.close();
            System.out.println(result);
            if (result) {
                System.out.println("Download Status: 100%");
            } else if(result == false) {
                System.out.println("Download won't work");
            }
            con.logout();
            con.disconnect();
        }
    }
    catch (Exception e)
    {
        System.out.println("download failed");
        e.printStackTrace();
    }

}

проблема в том, что сама загрузка работает нормально. Но загруженный файл пуст. Если я попробую его с изображением, оно не будет «читабельным». Загрузка вместо этого работает отлично. Я использую Apache Common IO Library для функции FTP.

Если я загружаю файл, консоль показывает первый статус 5%, 20%, 50% и, после добавления ложного утверждения, Загрузка выиграна ' t работа ...

Я понятия не имею, почему сам файл загружается, но не содержит никакого содержимого.

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 08 февраля 2020

Я нашел решение.

Я добавил следующие две вещи, и теперь это работает

con.execPBSZ(0);
con.execPROT("P");

Не знаю, что это означает, но я собираюсь выяснить это .

0 голосов
/ 09 февраля 2020

Я знаю, что этот ответ не так c, но я хотел бы привести пример для пользователя rzwitserloot, который показывает, что printStackTrace() не скрывает никакой важной информации. Это не вписывается в комментарий:

public class Main
{

    public static void doSomething()
    {
        int array[] = {1, 2, 3};
        int b = array[3];  // throws Exception
    }

    public static void test() throws Exception
    {
        try
        {
            doSomething();
        }
        catch (Exception e)
        {
            throw new Exception("something bad happened", e);
        }
    }

    public static void main(String[] args) throws Exception
    {
        try
        {
            test();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

Производит вывод:

java.lang.Exception: something bad happened
    at Main.test(Main.java:18)
    at Main.main(Main.java:26)
Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
    at Main.doSomething(Main.java:7)
    at Main.test(Main.java:14)
    ... 1 more

screenshot of output

См. Также документацию Oracle: specification of printStackTrace

0 голосов
/ 08 февраля 2020

Вы неправильно используете ресурсы в java.

Каждый раз, когда вы создаете объект, представляющий ресурс, вы должны его закрыть. Вы открываете новый FileOutputStream, и это ресурс. Все, что реализует AutoCloseable, определенно является ресурсом, который вы должны закрыть. Попробуйте это:

try (OutputStream out = new FileOutputStream(data /* no need to wrap in File */)) {
    // do your stuff with out here
}

Второе примечание: ваша обработка исключений ужасна; пожалуйста, прекратите делать эту распространенную ошибку. Исключения содержат 4 полезных бита информации: Тип, Сообщение, Трассировка и Причина. Вы буквально бросаете 3 из 4 в мусорное ведро. Просто добавьте throws Exception к вашему основному методу и вашему downloadFile методу. Это экономит ваш набор текста и делает ваши сообщения об ошибках гораздо более полезными.

...