Как отправить файл на фтп сервер?

Рейтинг: -1Ответов: 1Опубликовано: 30.03.2023

Как отправить файл а имено картинку на фтп сервер в указанную директорию?

Пробовал таким образом но получаю неудачу.

btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FTPClient ftpClient = null;

                try {
                    ftpClient = new FTPClient();
                    ftpClient.connect("*********");

                    if (ftpClient.login("*******", "********")) {
                        ftpClient.enterLocalPassiveMode();
                        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
                        String data = "file:///android_asset/example.png";

                        FileInputStream in = new FileInputStream(data);
                        FTPClient con = null;
                        boolean result = con.storeFile("/example.png", in);
                        in.close();
                        ftpClient.logout();
                        ftpClient.disconnect();
                    }
                }
                catch (Exception e) {
                    Toast.makeText(getApplicationContext(), "Неудача", Toast.LENGTH_SHORT).show();
                }
            }
        });

При использование ниже указанного кода получаю ту же ошибку

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        FTPClient ftpClient = new FTPClient();

        try {
            ftpClient.connect("*********");

            if (ftpClient.login("*******", "********")) {
                ftpClient.enterLocalPassiveMode();
                ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
                String sourceFilePath = "file:///android_asset/example.png";
                File sourceFile = new File(new URI(sourceFilePath));
                InputStream inputStream = new FileInputStream(sourceFile);

                boolean result = ftpClient.storeFile("/example.png", inputStream);
                inputStream.close();

                if (result) {
                    Toast.makeText(getApplicationContext(), "Файл успешно загружен на сервер", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(getApplicationContext(), "Не удалось загрузить файл на сервер", Toast.LENGTH_SHORT).show();
                }

                ftpClient.logout();
                ftpClient.disconnect();
            }
        }
   

 catch (Exception e) {
        Toast.makeText(getApplicationContext(), "Неудача", Toast.LENGTH_SHORT).show();
        e.printStackTrace();
    }
}

});

Logcat

    2023-03-30 22:36:43.280 9422-9422/com.buratinoapps.openapp I/Choreographer: Skipped 32 frames!  The application may be doing too much work on its main thread.
2023-03-30 22:36:47.810 9422-9422/com.buratinoapps.openapp W/System.err: android.os.NetworkOnMainThreadException
2023-03-30 22:36:47.812 9422-9422/com.buratinoapps.openapp W/System.err:     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1668)
2023-03-30 22:36:47.815 9422-9422/com.buratinoapps.openapp W/System.err:     at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:115)
2023-03-30 22:36:47.822 9422-9422/com.buratinoapps.openapp W/System.err:     at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:103)
2023-03-30 22:36:47.822 9422-9422/com.buratinoapps.openapp W/System.err:     at java.net.InetAddress.getByName(InetAddress.java:1106)
2023-03-30 22:36:47.824 9422-9422/com.buratinoapps.openapp W/System.err:     at java.net.InetSocketAddress.<init>(InetSocketAddress.java:235)
2023-03-30 22:36:47.829 9422-9422/com.buratinoapps.openapp W/System.err:     at org.apache.commons.net.SocketClient.connect(SocketClient.java:176)
2023-03-30 22:36:47.832 9422-9422/com.buratinoapps.openapp W/System.err:     at org.apache.commons.net.SocketClient.connect(SocketClient.java:268)
2023-03-30 22:36:47.838 9422-9422/com.buratinoapps.openapp W/System.err:     at com.buratinoapps.openapp.MainActivity.lambda$onCreate$0$com-buratinoapps-openapp-MainActivity(MainActivity.java:41)
2023-03-30 22:36:47.839 9422-9422/com.buratinoapps.openapp W/System.err:     at com.buratinoapps.openapp.MainActivity$$ExternalSyntheticLambda0.onClick(Unknown Source:4)
2023-03-30 22:36:47.839 9422-9422/com.buratinoapps.openapp W/System.err:     at android.view.View.performClick(View.java:7455)
2023-03-30 22:36:47.839 9422-9422/com.buratinoapps.openapp W/System.err:     at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1202)
2023-03-30 22:36:47.840 9422-9422/com.buratinoapps.openapp W/System.err:     at android.view.View.performClickInternal(View.java:7432)
2023-03-30 22:36:47.840 9422-9422/com.buratinoapps.openapp W/System.err:     at android.view.View.access$3700(View.java:835)
2023-03-30 22:36:47.846 9422-9422/com.buratinoapps.openapp W/System.err:     at android.view.View$PerformClick.run(View.java:28810)
2023-03-30 22:36:47.846 9422-9422/com.buratinoapps.openapp W/System.err:     at android.os.Handler.handleCallback(Handler.java:938)
2023-03-30 22:36:47.846 9422-9422/com.buratinoapps.openapp W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:99)
2023-03-30 22:36:47.847 9422-9422/com.buratinoapps.openapp W/System.err:     at android.os.Looper.loopOnce(Looper.java:201)
2023-03-30 22:36:47.847 9422-9422/com.buratinoapps.openapp W/System.err:     at android.os.Looper.loop(Looper.java:288)
2023-03-30 22:36:47.856 9422-9422/com.buratinoapps.openapp W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:7842)
2023-03-30 22:36:47.856 9422-9422/com.buratinoapps.openapp W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
2023-03-30 22:36:47.856 9422-9422/com.buratinoapps.openapp W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
2023-03-30 22:36:47.857 9422-9422/com.buratinoapps.openapp W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

Указывает на 41 строку ftpClient.connect("92.123.11.126");

Я это дело в поток засунул но нечего не срабатывает.

btn.setOnClickListener(v -> {
        new Thread(()->{
            Looper.prepare();
        try {
            ftpClient.connect("93.190.17.186/photo");

            if (ftpClient.login("ftp_user", "nF773i9skJ62")) {
                ftpClient.enterLocalPassiveMode();
                ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
                String sourceFilePath = "file:///android_asset/example.txt";
                File sourceFile = new File(new URI(sourceFilePath));
                InputStream inputStream = new FileInputStream(sourceFile);

                boolean result = ftpClient.storeFile("example.txt", inputStream);
                inputStream.close();

                if (result) {
                    Toast.makeText(getApplicationContext(), "Файл успешно загружен на сервер", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(getApplicationContext(), "Не удалось загрузить файл на сервер", Toast.LENGTH_SHORT).show();
                }

                ftpClient.logout();
                ftpClient.disconnect();
            }
        }
        catch (Exception e) {
            Toast.makeText(getApplicationContext(), "Неудача", Toast.LENGTH_SHORT).show();
            e.printStackTrace();
        }

        }).start();
    });

Ответы

▲ 0

Проблема в том, что вы создаете объект FTPClient дважды: сначала внутри метода onClick, а потом - снова внутри блока try. При этом, вы вызываете методы только на последнем созданном объекте ftpClient, который не инициализирован (то есть имеет значение null).

Вам нужно использовать один и тот же объект ftpClient во всех местах кода, где вы работаете с FTP сервером. Также, для отправки файла на сервер, вам нужно передавать именно объект ftpClient, а не con, который не был инициализирован. Попробуйте следующий код:

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        FTPClient ftpClient = new FTPClient();

        try {
            ftpClient.connect("*********");

            if (ftpClient.login("*******", "********")) {
                ftpClient.enterLocalPassiveMode();
                ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
                String sourceFilePath = "file:///android_asset/example.png";
                File sourceFile = new File(new URI(sourceFilePath));
                InputStream inputStream = new FileInputStream(sourceFile);

                boolean result = ftpClient.storeFile("/example.png", inputStream);
                inputStream.close();

                if (result) {
                    Toast.makeText(getApplicationContext(), "Файл успешно загружен на сервер", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(getApplicationContext(), "Не удалось загрузить файл на сервер", Toast.LENGTH_SHORT).show();
                }

                ftpClient.logout();
                ftpClient.disconnect();
            }
        }
        catch (Exception e) {
            Toast.makeText(getApplicationContext(), "Неудача", Toast.LENGTH_SHORT).show();
            e.printStackTrace();
        }
    }
})

В этом коде я создаю объект ftpClient только один раз, передаю ему источник файла sourceFile в виде объекта File, открываю поток inputStream для чтения файла, и затем передаю его в метод storeFile() объекта ftpClient. После завершения загрузки, я закрываю поток и выводлю сообщение об успешной/неуспешной загрузке файла на сервер.