我是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'是否正确?
提前致谢。
答案 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(); 强> 登录后