尝试通过ftp在android上下载文件时出错

时间:2011-07-21 06:25:33

标签: android ftp download

我是Android编码的业余爱好者。 我正在尝试设置一个能够从ftp服务器下载文件的Android应用程序。在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 :(得分:0)

您需要在日志消息中添加Exception变量。您可能还希望使用以下方法打印问题的完整堆栈跟踪:     e.printStackTrace(); 通常/ SD卡应该工作,但使用Environment对象请求SD卡位置更可靠。在android中查看有关android文件存储的更多详细信息 link

答案 1 :(得分:0)

  

另外,如果上面的代码有任何更改,请告诉我。目的地地址是'/ sdcard'是否正确?

至少你应该使用/sdcard/filename.ext,但如果你确定/sdcard是一个有效的根目录,这只能用于测试目的。

要正确执行操作,请使用getExternalFilesDir查找外部存储“文件”目录的正确路径,该路径可用于您自己的应用的“私有”文件。请参阅该链接中的示例代码以了解如何使用它。您需要为输出流提供文件名,而不仅仅是目录的路径。

这可能不是您的问题的答案,而只是使用......

FileOutputStream desFileStream = new FileOutputStream(desFilePath);

...当desFilePath是一个目录时,即/sdcard,并且保证文件不会失败。

答案 2 :(得分:-1)

使用 的 mFTPClient.enterLocalActiveMode(); 登录后