欢迎光临
我们一直在努力

Android上传文件到FTP服务器

实现背景

近期接触到一个需求,就是将文件从Android系统上传到ftp服务器,虽然之前接触过FTP服务器,了解基本的使用流程,但是将此流程从使用习惯转化为代码实现还是有一定难度的。但是基本的流程还是比较清楚的:

  • 1.在Android手机上创建一个FTP客户端
  • 2.设置host及端口建立与FTP服务器的连接
  • 3.使用用户名和密码登录FTP服务器
  • 4.更改目录,将当前客户端指向的服务端的文件夹从跟目录调整到指定的目录
  • 5.上传文件,并等待上传完成的结果
  • 6.断开和FTP服务器的链接

代码实现

1.创建FTP客户端并定义相关的操作流程

public class ftpclientFunctions { private static final String TAG = "FTPClientFunctions"; private FTPClient ftpClient = null; // FTP客户端 /** * 连接到FTP服务器 * * @param host ftp服务器域名 * @param username 访问用户名 * @param password 访问密码 * @param port 端口 * @return 是否连接成功 */ public boolean ftpConnect(String host, String username, String password, int port) { try { ftpClient = new FTPClient(); Log.d(TAG, "connecting to the ftp server " + host + " :" + port); ftpClient.connect(host, port); // 根据返回的状态码,判断链接是否建立成功 if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { Log.d(TAG, "login to the ftp server"); boolean status = ftpClient.login(username, password); /* * 设置文件传输模式 * 避免一些可能会出现的问题,在这里必须要设定文件的传输格式。 * 在这里我们使用BINARY_FILE_TYPE来传输文本、图像和压缩文件。 */ ftpClient.setFileType(FTP.BINARY_FILE_TYPE); ftpClient.enterLocalPassiveMode(); return status; } } catch (Exception e) { e.printStackTrace(); Log.d(TAG, "Error: could not connect to host " + host); } return false; } /** * 断开ftp服务器连接 * * @return 断开结果 */ public boolean ftpDisconnect() { // 判断空指针 if (ftpClient == null) { return true; } // 断开ftp服务器连接 try { ftpClient.logout(); ftpClient.disconnect(); return true; } catch (Exception e) { Log.d(TAG, "Error occurred while disconnecting from ftp server."); } return false; } /** * ftp 文件上传 * * @param srcFilePath 源文件目录 * @param desFileName 文件名称 * @param desDirectory 目标文件 * @return 文件上传结果 */ public boolean ftpUpload(String srcFilePath, String desFileName, String desDirectory) { boolean status = false; try { FileInputStream srcFileStream = new FileInputStream(srcFilePath); status = ftpClient.storeFile(desFileName, srcFileStream); srcFileStream.close(); return status; } catch (Exception e) { e.printStackTrace(); Log.d(TAG, "upload failed: " + e.getLocalizedMessage()); } return status; } /** * ftp 更改目录 * * @param path 更改的路径 * @return 更改是否成功 */ public boolean ftpChangeDir(String path) { boolean status = false; try { status = ftpClient.changeWorkingDirectory(path); } catch (Exception e) { e.printStackTrace(); Log.d(TAG, "change directory failed: " + e.getLocalizedMessage()); } return status; } } 

2.完整的操作流程

// 网络操作,但开一个线程进行处理 new Thread(new Runnable() { @Override public void run() { // TODO 可以首先去判断一下网络 ftpClient = new FTPClientFunctions(); boolean connectResult = ftpClient.ftpConnect(FTP_SERVER, FTP_USERNAME, FTP_PASSWORD, FTP_PORT); if (connectResult) { boolean changeDirResult = ftpClient.ftpChangeDir("/**"); if (changeDirResult) { boolean uploadResult = ftpClient.ftpUpload(sourceFilePath, descFileName, ""); if (uploadResult) { Log.w(TAG, "上传成功"); boolean disConnectResult = ftpClient.ftpDisconnect(); if(disConnectResult) { Log.e(TAG, "关闭ftp连接成功"); } else { Log.e(TAG, "关闭ftp连接失败"); } } else { Log.w(TAG, "上传失败"); } } else { Log.w(TAG, "切换ftp目录失败"); } } else { Log.w(TAG, "连接ftp服务器失败"); } } }).start(); 

3.FTP交互相关库

commons-net-3.6.jar : Apache Commons Net 阿帕奇提供的常用的网络交互的jar包。
支持以下协议:

  • FTP/FTPS
  • FTP over HTTP (experimental)
  • NNTP
  • SMTP(S)
  • POP3(S)
  • IMAP(S)
  • Telnet
  • TFTP
  • Finger
  • Whois
  • rexec/rcmd/rlogin
  • Time (rdate) and Daytime
  • Echo
  • Discard
  • NTP/SNTP

在这里我们只用的了FTP协议。不得不说,库使用起来还是相当方便的。
相关链接:http://commons.apache.org/proper/commons-net/

  • 海报
海报图正在生成中...
赞(0) 打赏
声明:
1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。
2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。
3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。
4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。
文章名称:《Android上传文件到FTP服务器》
文章链接:https://www.456zj.com/5108.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址