android端的远程ftp客户端管理,需通过第三方JAR包支持。(ftp4j)网上也有许多相关的文档。我主要是通过ftp4j的支持实现二维码扫描,下载fdp文件功能。
简单的介绍下ftp客户端的一些操作方法。
- 使用方法:
- FTPClient client = new FTPClient();
- client.connect("ftp.host.com", 8021);
- client.login("carlo", "mypassword");
- 没有异常表示连接成功,否则会垫子抛出FTPException异常。
- 当然还有一些重载方法,如果端口为21就可以用client.connect(host);
- 为了处理匿名的登录,可以client.login("anonymous", "ftp4j");,用户名是anonymous,密码随意。
- 登录之后需要对服务器进行操作,如目录显示,进入等;
- String dir = client.currentDirectory(); 显示当前目录
- 修改进入的目录
- client.changeDirectory(newPath);
- 可以使用相对路径,也可以使用绝对路径,下面两种都可以。
- client.changeDirectory("/an/absolute/one");
- client.changeDirectory("relative");
- 如果只想进入上一层:client.changeDirectoryUp();
- ftp4j中有两个特别目录“.","..",分别表示根目录与上一层目录。
- 重命名:client.rename("oldname", "newname");
- 或移动文件:client.rename("myfile.txt", "myfolder/myfile.txt");
- 删除文件:client.deleteFile(relativeOrAbsolutePath);可以使用相对或绝对路径。
- 创建目录:client.createDirectory("newfolder");
- 删除目录:client.deleteDirectory(absoluteOrRelativePath);
- 显示文件,目录,链接
- 由于服务器的不同,所以返回的文件列表格式也不同,可能是UNIX,也可能是WIN的。ftp4j目录支持:
- UNIX style and variants (i.e. MAC style)
- DOS style
- NetWare styles
- EPLF
- MLSD
- .显示当前的目录文件:FTPFile[] list = client.list();
- FTPFile包含了所需要的信息,从type可以知道是目录还是文件,或链接。
- 除此外还可以过滤:
- FTPFile[] list = client.list("*.jpg");过滤了,只显示图片
- 如果想知道修改上期,需要单独获取,不能从上面的list()方法得到:
- java.util.Date md = client.modifiedDate("filename.ext");
- 接下来就是上传与下载了:
- client.download("remoteFile.ext", new java.io.File("localFile.ext"));
- client.upload(new java.io.File("localFile.ext"));
- 追加内容的上传
- client.append(new java.io.File("localFile.ext"));
- 这些是阻塞方法,只有在完成后才返回,所以一个FTPClient只能在同时进行一个传输。如果你想多个文件同时传输,可以使用多个FTPClient,FTPClient单独连接服务器。
- 当今的软件不能只是功能上实现了,还需要注意用户体验,所以上传下下载需要知道进度,ftp4j都通过FTPDataTransferListener这个接口来实现的,如果有一个方法:
- public void transferred(int length) {
- // Yet other length bytes has been transferred since the last time this
- 这个方法是说在距上一次传输到这一次传输的内容多少,
- 如果要有一个进度条,需要知道总量,然后当前传输的量,所以需要进行一些处理,如在开始上传时,获取本地文件上传大小,然后从这个接口中得到已经传输的文件叠加起来得到已经传输文件总量的大小,再计算得到进度。
- 从FTPClient中可以知道:在上传时:listener.transferred(l);l表示这次传输的量,但这似乎不是我们想要的,
- 修改为:listener.transferred(done);这个done表示的是上传的总量,是已经存在的,直接使用就好了。
- }
- 然后就可以通过重载方法加入这个监听器client.download("remoteFile.ext", new java.io.File("localFile.ext"), new MyTransferListener());,其它略了。
- 对同一个FTPClient,多个线程间的操作是有影响的,如可以在其它线程中调用abortCurrentDataTransfer()来结当前的传输行为。
- 这个方法传入 false表示突然停止,传入true表示发送ABOR命令,是个合法的结束。然后会有FTPAbortedException异常。
- ftp4j还支持断点:
- client.download("remoteFile.ext", new java.io.File("localFile.ext"), 1056);表示从1057开始,前面的不需要再传输了。
- 上传也类似 。
public static boolean initFtp() {//初始化ftp对象
if (!isConnected()) {addressFtp = "192.168.43.1";
ftp = new FTPClient();
try {
ftp.connect(addressFtp, 2121);
ftp.login("ftp", "ftp");
return true;
} catch (IllegalStateException e) {
Log.e(TAG, "IllegalStateException:" + e.getMessage());
e.printStackTrace();
} catch (IOException e) {
Log.e(TAG, "IOException:" + e.getMessage());
e.printStackTrace();
} catch (FTPIllegalReplyException e) {
Log.e(TAG, "FTPIllegalReplyException:" + e.getMessage());
e.printStackTrace();
} catch (FTPException e) {
Log.e(TAG, "FTPException:" + e.getMessage());
e.printStackTrace();
}
return false;
} else {
return true;
}
}
private static boolean isConnected() {
if (ftp != null && ftp.isConnected())
return true;
return false;
}
public static Boolean changeDir() {//通过ftp找到自己要下载的东西的目录
try {
String temp = "/mnt/sdcard/";
ftp.changeDirectory(temp);
// FTPFile[] list = ftp.list();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
ftp.download(temp+"an.pdf", new java.io.File("/storage/sdcard0/localFile.pdf"),FTPData);//下载文件
}
}){};
//return a;
//System.out.println("list:"+list.toString()+"size:"+list.length);
} catch (IllegalStateException e) {
Log.e(TAG, "IllegalStateException:" + e.getMessage());
e.printStackTrace();
} catch (IOException e) {
Log.e(TAG, "IOException:" + e.getMessage());
e.printStackTrace();
} catch (FTPIllegalReplyException e) {
Log.e(TAG, "FTPIllegalReplyException:" + e.getMessage());
e.printStackTrace();
} catch (FTPException e) {
Log.e(TAG, "FTPException:" + e.getMessage());
e.printStackTrace();
} catch (FTPDataTransferException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FTPAbortedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return a;
}
static FTPDataTransferListener FTPData = new FTPDataTransferListener(){//下载的监听
@Override
public void aborted() {
// TODO Auto-generated method stub
}
@Override
public void completed() {
// TODO Auto-generated method stub
a=true;
System.out.println("wancheng");
}
@Override
public void failed() {
// TODO Auto-generated method stub
a=false;
System.out.println("shibai");
}
@Override
public void started() {
// TODO Auto-generated method stub
}
@Override
public void transferred(int arg0) {
// TODO Auto-generated method stub
}};
public static Intent getPdfFileIntent( String param ) //下载完成默认打开所下载的文件
{
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(new File(param));
intent.setDataAndType(uri, "application/pdf");
return intent;
}