Ошибка при попытке скачать файл через ftp на андроид - PullRequest
0 голосов
/ 21 июля 2011

Я любитель андроид кодирования. Я пытаюсь настроить приложение для Android с возможностью загрузки файла с FTP-сервера. Во время выполнения кода на эмуляторе Android 2.2 я могу подключиться к серверу FTP, но часть загрузки показывает ошибку. LogCat выдает «загрузка не удалась».

package com.ftconnect.down;
import java.io.FileOutputStream;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import org.apache.commons.net.ftp.*;

public class FTPConnectActivity extends Activity {
/** Called when the activity is first created. */

public FTPClient mFTPClient = null;
public boolean mConnect;
public boolean mDownload;
public boolean mDisconnected;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mConnect = ftpConnect("xxx.xxx.xxx.xxx", "admin",
            "123456", 21);

    mDownload = ftpDownload("xxx.xxx.xxx.xxx/ftp.mp3", "/sdcard");

    mDisconnected = ftpDisconnect();

}

public boolean ftpConnect(String host, String username, String password,
        int port) {
    try {
        mFTPClient = new FTPClient();
        // connecting to the host
        mFTPClient.connect(host, port);
        Log.d("ftpConnectApp", "Connecting to " + host);

        // now check the reply code, if positive mean connection success
        if (FTPReply.isPositiveCompletion(mFTPClient.getReplyCode())) {
            // login using username & password
            boolean status = mFTPClient.login(username, password);
            return status;
        }
    } catch (Exception e) {
        Log.d("ftpConnectApp", "Error: could not connect to host " + host);
    }

    return false;
}

public boolean ftpDownload(String srcFilePath, String desFilePath) {
    boolean status = false;
    try {
        FileOutputStream desFileStream = new FileOutputStream(desFilePath);
        ;
        status = mFTPClient.retrieveFile(srcFilePath, desFileStream);
        desFileStream.close();

        return status;
    } catch (Exception e) {
        Log.d("ftpConnectApp", "download failed");
    }

    return status;
}

public boolean ftpDisconnect() {
    try {
        mFTPClient.logout();
        mFTPClient.disconnect();
        return true;
    } catch (Exception e) {
        Log.d("ftpConnectApp",
                "Error occurred while disconnecting from ftp server.");
    }

    return false;
}

}

Я настроил Интернет и записал внешнее разрешение в файл манифеста Android. Должен ли я включить какие-либо другие разрешения?

Кроме того, дайте мне знать, если есть какие-либо изменения в коде выше. Правильный ли адрес назначения как '/ sdcard'?

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 21 июля 2011

Кроме того, дайте мне знать, если будут внесены какие-либо изменения в код выше. Правильный ли адрес назначения как '/ sdcard'?

По крайней мере, вы должны использовать /sdcard/filename.ext, хотя это будет нормально только для целей тестирования, если вы уверены, что /sdcard является допустимым корневым каталогом.

Чтобы сделать все правильно, используйте getExternalFilesDir , чтобы найти правильный путь к каталогу «files» внешнего хранилища, который можно использовать для «приватных» файлов для вашего собственного приложения. Смотрите пример кода в этой ссылке, чтобы узнать, как его использовать. Вам потребуется указать имя файла для выходного потока, а не просто путь к каталогу.

Возможно, это не решение вашей проблемы, а просто использование ...

FileOutputStream desFileStream = new FileOutputStream(desFilePath);

... когда desFilePath является каталогом, то есть /sdcard, а не файл гарантированно завершится с ошибкой.

0 голосов
/ 20 июня 2016

Использовать mFTPClient.enterLocalActiveMode (); после входа в систему

0 голосов
/ 21 июля 2011

Вам необходимо добавить переменную Exception в ваше сообщение журнала.Вы также можете распечатать полный стек трассировки проблемы с помощью: e.printStackTrace ();Обычно / sdcard должен работать, однако более надежно запрашивать местоположение SD-карты, используя объект Environment.Подробнее о хранилище файлов на андроиде смотрите в ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...