AndroidFtp客户端(二)

使用方法:
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开始,前面的不需要再传输了。
上传也类似 。

主动与被动的传输:
主动的传输行为:
客户端发送ip地址与端口号到服务器
客户端请求服务器传输数据,开始监听端口
服务器连接地址与端口
数据传输由一个新的通道开始传输。
主动的需要客户端支持接收信息如果客户端有防火墙,代理等,会有些问题,

被动的传输行为:
客户端请求服务器准备被动的数据传输。
服务器回复并带有ip与端口。
客户端请求传输也连接。
数据传输由一个新的通道开始传输。

通过以下方式改变:
client.setPassive(false); // Active mode
client.setPassive(true); // Passive mode
默认是被动的。
这些属性可以通过系统属性来设置 :
如ftp4j.activeDataTransfer.acceptTimeout设置超时时间:
java -Dftp4j.activeDataTransfer.hostAddress=178.12.34.167
     -Dftp4j.activeDataTransfer.portRange=6000-7000
     -Dftp4j.activeDataTransfer.acceptTimeout=5000 MyClass

Set property values directly in the code. I.e.:
System.setProperty("ftp4j.activeDataTransfer.hostAddress", "178.12.34.167");
System.setProperty("ftp4j.activeDataTransfer.portRange", "6000-7000");
System.setProperty("ftp4j.activeDataTransfer.acceptTimeout", "5000");

二进制与文本传输类型:
从源码可以看出是以后缀名来判断文件的类型,所以个人认为,上传的文件需要自己知道什么类型的,不小心将二进制文件改为txt后缀,可能会有些问题。
client.setType(FTPClient.TYPE_TEXTUAL);
client.setType(FTPClient.TYPE_BINARY);
client.setType(FTPClient.TYPE_AUTO);
当然它提供了一些自定义的类型client.setTextualExtensionRecognizer(myRecognizer);

一些服务器支持数据压缩传输,叫MODE Z。可以通过client.setCompressionEnabled(true);打开,在这之前可以确认:boolean compressionEnabled = client.isCompressionEnabled();

站点规范与命令:
FTPReply reply = client.sendSiteCommand("YOUR COMMAND");
也可以自定义命令
FTPReply reply = client.sendCustomCommand("YOUR COMMAND");
都返回一个FTPReply对象。可以从这个对象得到一些返回代码,信息等内容。

-----------------------------------------------
上面是ftp4j的文档的一些知识。有了以上知识,开发一个android客户端就相对容易多了。
如我想得到服务器的文件目录操作(选择文件,选择目录,进入目录)
就可以使用ListView+ListAdapter显示目录与文件,然后由于 android的操作可以使用OnItemLongClickListener长按与短按OnItemClickListener分别指定一些操作,如短按可以选择为进入目录:
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            FTPFile ftpFile=mFileList.get(i);
            String filename=ftpFile.getName();
            if ("..".equals(filename)) {
                Log.d(TAG, "change directory up.");
                changeDirectoryUp();
            } else if (".".equals(filename)) {
                Log.d(TAG, "change directory root");
                changeDirectory("/");
            } else {
                if (ftpFile.getType()==FTPFile.TYPE_DIRECTORY) {
                    Log.d(TAG, "change directory:"+filename);
                    changeDirectory(filename);
                }
            }
        }

 

mFtpClient.changeDirectory(path);
mFtpClient.changeDirectoryUp();就是上面最终调用的方法。
然后在长按中:
FTPFile ftpFile=mFileList.get(i);
            String filename=ftpFile.getName();
            if ("..".equals(filename)||".".equals(filename)) {
                Log.d(TAG, "在这里没有处理");
            } else {
                if (ftpFile.getType()==FTPFile.TYPE_DIRECTORY) {
                    Log.d(TAG, "change directory:"+filename);
                    selectDirectory(filename);
                }
            }
selectDirectory()方法就是作为选中目录上传目的地。然后可以将本地文件传入这个目录。
在改变目录后调用:
private void refreshFiles(FTPClient mFtpClient) throws IOException, FTPIllegalReplyException, FTPException {
        FTPFile[] files=new FTPFile[0];
        try {
            files=mFtpClient.list();
            List<FTPFile> ftpFiles=(List<FTPFile>) Arrays.asList(files);
            mFileList.clear();
            mFileList.addAll(ftpFiles);
            Message message=Message.obtain(mHandler, REFRESH_FILE);
            message.obj=mFtpClient.currentDirectory();
            mHandler.sendMessage(message);
//这里就是刷新ListView。
        } catch (FTPDataTransferException e) {
            e.printStackTrace();
        } catch (FTPAbortedException e) {
            e.printStackTrace();
        } catch (FTPListParseException e) {
            e.printStackTrace();
        }
    }

提供了上传下载的功能后,就可以使用它了,建立一个简单的ftp服务器,HOMEftpserver就是个不错的东西,然后拍照或录像再上传。其它就不说了,直接传代码上来。完成的程序可以使用,只是有些简陋,仅供参考。目前的需求就是拍照来录像后上传到ftp。

源码下载地址:http://phenom.iteye.com/blog/1551554

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,这是你可以使用的步骤来实现一个Android FTP客户端: 1. 使用Android Studio创建一个新的Android项目。 2. 在build.gradle文件中添加对Apache Commons Net库的依赖,它是实现FTP客户端所必需的库。 dependencies { implementation 'commons-net:commons-net:3.7' } 3. 在您的主活动中添加一些用于连接到FTP服务器的代码。您可以使用FTPClient类来连接和操作FTP服务器。 FTPClient ftpClient = new FTPClient(); ftpClient.connect(server, port); ftpClient.login(username, password); 4. 现在,您可以使用FTPClient实例来执行各种操作,如上传文件、下载文件、创建目录等。 例如,要上传文件,您可以使用以下代码: InputStream inputStream = new FileInputStream(localFile); ftpClient.storeFile(serverFile, inputStream); inputStream.close(); 5. 最后,记得在退出应用程序时断开与FTP服务器的连接。 ftpClient.logout(); ftpClient.disconnect(); 希望这对你有帮助! ### 回答2: 要实现一个AndroidFTP客户端,可以按照以下步骤进行: 1. 导入FTP类库:首先需要在Android项目中导入FTP的类库,例如Apache Commons Net库或者Android FTP库。这些类库提供了FTP客户端所需的功能和方法。 2. 创建FTP连接:在Android应用中,可以使用FTP客户端类来创建一个FTP连接对象。通过指定FTP服务器的IP地址、用户名和密码来建立连接。 3. 执行FTP操作:一旦连接建立成功,就可以执行FTP操作。这些操作可以包括上传文件、下载文件、删除文件、创建文件夹等。可以通过调用FTP客户端对象的相应方法来执行这些操作。 4. 实现文件传输:要上传或下载文件,可以使用FTP客户端提供的方法。要上传文件,可以将本地文件的路径作为参数,通过调用相应方法将文件传输到FTP服务器上。要下载文件,可以指定要下载的文件路径和下载的本地路径,然后调用相应方法来实现。 5. 错误处理:在实现FTP客户端时,还需要考虑错误处理。例如,在连接或文件传输过程中可能会发生网络异常或服务器错误。可以使用try-catch语句来捕获这些异常,并根据需要采取相应的处理措施。 6. 界面设计:为了更好地与用户交互,可以设计一个用户界面来显示FTP操作的进度和结果。可以使用Android中提供的布局和小部件来创建用户界面,并更新进度和显示结果。 以上是一个基本的Android实现FTP客户端的步骤。根据具体的需求,还可以进行更多的功能扩展,例如实现断点续传、支持多线程下载等。 ### 回答3: 实现一个Android上的FTP客户端可以通过以下步骤: 1. 添加权限:在AndroidManifest.xml文件中添加网络权限,以便应用程序可以进行网络通信。 2. 创建FTP连接类:创建FTP连接类,用于建立和管理与FTP服务器的连接。该类应该包括连接到FTP服务器的方法、断开连接的方法以及上传和下载文件的方法。 3. 用户界面设计:创建一个用户界面,以便用户可以输入FTP服务器的地址、用户名和密码。还可以添加其他的选项,例如显示已上传和已下载的文件列表。 4. 连接到FTP服务器:当用户点击连接按钮时,读取用户输入的FTP服务器地址、用户名和密码,并使用FTP连接类中的方法连接到服务器上。 5. 上传文件:创建一个文件选择器,以便用户可以选择要上传的文件。当用户选择文件后,使用FTP连接类中的上传文件的方法将文件上传到服务器上。 6. 下载文件:显示服务器上的文件列表,当用户选择要下载的文件时,使用FTP连接类中的下载文件的方法将文件下载到设备上。 7. 错误处理:在连接到服务器、上传和下载文件过程中,需要添加错误处理机制,以便在发生错误时提示用户出现问题,并提供重新连接或重新上传/下载的选项。 8. UI界面优化:可以添加进度条显示上传和下载的进度,增加用户体验。 9. 测试和调试:编译并运行应用程序,测试连接、上传和下载功能。在出现错误时,使用日志输出和调试工具进行调试。 10. 发布应用程序:完成开发后,可以使用Android工具生成应用程序的安装文件,并发布到应用商店供用户下载使用。 以上就是大致的步骤,根据实际需求还可以对功能进行扩展和优化,比如实现断点续传、多线程并行传输等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值