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/
Android 上传文件到 FTP 服务器的更多相关文章
- .Net 上传文件到ftp服务器和下载文件
突然发现又很久没有写博客了,想起哎呦,还是写一篇博客记录一下吧,虽然自己还是那个渣渣猿. 最近在做上传文件的功能,上传到ftp文件服务器有利于管理上传文件. 前面的博客有写到layui如何上传文件,然 ...
- java 上传文件到 ftp 服务器
1. java 上传文件到 ftp 服务器 package com.taotao.common.utils; import java.io.File; import java.io.FileInpu ...
- asp.net 服务器 上传文件到 FTP服务器
private string ftpServerIP = "服务器ip";//服务器ip private string ftpUserID = "ftp的用户名" ...
- Android上传文件之FTP
android客户端实现FTP文件(包括图片)上传应该没什么难度.写下来就了为了记录一下,望能帮到新手. 需要用到 commons-net-3.0.1.jar,后面附上jar包. 直接上代码: /** ...
- Linux上F上传文件到FTP服务器
Linux上上传跟Windows上上传不一样,在Windows上测试没问题,但是放到Linux服务器上跑,上传的文件中文显示乱码.解决方案: FtpUtil.java红色标记处 package cn. ...
- android上传文件到wamp服务器
1.php server(wamp)部分 建立unload.php页面代码如下 <?php move_uploaded_file($_FILES["file1"][" ...
- ftp配置 Laravel上传文件到ftp服务器
listen=YES anonymous_enable=NO local_enable=YES write_enable=YES local_umask= dirmessage_enable=YES ...
- Linux系统下定时上传文件至FTP服务器脚本
环境:Red Hat Enterprise Linux Server release 6.4 需求:需要将Oracle数据库的定时备份上传至FTP服务器 1.干货,用户名:oracle,数据库名称:X ...
- Linux: 通过命令行上传文件到ftp服务器
url -T fie-name ftp://server-address --user user:password
随机推荐
- Eclipse 中Git的使用及如何解决冲突
1. 如何导入已有Git项目 1.1 File——>import… 出现以下界面 1.2 找到Git,然后双击‘Project from Git.或者点击next 1.3 双击Clone URI ...
- Android GreenDao 在组件化项目中的一个问题 - 2018年7月5日21:15:14
组件化项目使用GreenDao时注意的事项: 1.要在组件化中的基础库(domain层)创建实体类: 2.如果sycn之后不能生产Dao文件,使用 Android Studio 的Gradle插件重新 ...
- Vue.js组件之间的调用
index.html: <div id="app"></div> 运行完index.html之后自动寻找运行main.js文件 main.js: impor ...
- JVM系列3:类加载机制
了解类加载机制也是深入了解Java的重要一环,它包括加载过程.类加载器.加载机制等内容. 以下是我总结的思维导图. 首先讲讲类加载的时机,以下是会触发类加载的时机: 1.new.get/put/inv ...
- css3属性蒙版:-webkit-mask
-webkit-mask: 蒙版,用于将固定形状设置透明度,形状可以是一个div,也可以是一张图片: 用法:-webkit-mask: radial-gradient(transparent 50px ...
- 20175126《Java程序设计》第一周学习总结
# 学号 20175126 <Java程序设计>第一周学习总结 ## 教材学习内容总结 - 1.安装了WINDOS系统的JDK,并学会了利用JDK编写并编译JAVA程序的基本方法. ...
- ubuntu系统安装微信小程序开发工具
在ubuntu系统中安装微信小程序开发工具之前,先要安装wine与git 一.安装wine 1.如果您的系统是64位,启用32位架构(如果您还没有) sudo dpkg --add-architect ...
- DIV内容超出长度显示省略号,鼠标移上自动显示全部内容(EasyUI DataGrid)
如果想把DIV中超出的文本显示成省略号,而不是换行全部显示,有2个办法. 注:本文主要是以EasyUI的DataGrid为案例的,如果是其他场景只要底层是用DIV显示文本的应该都能使用. 首先可以给此 ...
- 20172325 2018-2019-2 《Java程序设计》第八周学习总结
20172325 2018-2019-2 <Java程序设计>第八周学习总结 教材学习内容总结 一.堆 1.什么是堆? 具有两个附加属性的一个二叉树. 堆分为小顶堆和大顶堆. 最小堆:对每 ...
- HDU 3594.Cactus 仙人掌图
Cactus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...