1.ftp依赖
看Android版本使用
compile 'commons-net:commons-net:3.5'
implementation 'commons-net:commons-net:3.5'
2.废话不多说,直接先上写的一个工具类
public class FTPUtils {
private static final String TAG = "FTPClientFunctions";
private FTPClient ftpClient = null; // FTP客户端
SharedPreferences preferences = XLApplication.getContext().getSharedPreferences("setting", Context.MODE_PRIVATE);
private String ip;
private String port;
private String username;
private String password;
/**
* 连接到FTP服务器
*
* @return 是否连接成功
*/
public boolean ftpConnect(Context context) {
try {
username = "anonymous";
password = "";
ip = preferences.getString("ftp_ip", XLApplication.getContext().getString(R.string.access_ip));
port = preferences.getString("ftp_port", XLApplication.getContext().getString(R.string.ftp_port));
ftpClient = new FTPClient();
Log.e(TAG, "connecting to the ftp server " + ip + " :" + port);
ftpClient.connect(ip, Integer.parseInt(port));
// 根据返回的状态码,判断链接是否建立成功
if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
Log.e(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.e(TAG, "Error: could not connect to host " + ip);
//此处应有提示
//ToastUtil.show((PostAlarmActivity)context,"FTP服务器连接失败");
}
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 文件名称
* @return 文件上传结果
*/
public boolean ftpUpload(String srcFilePath, String desFileName) {
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;
}
}
经过自己的多次调试终于调通了,那么我在这里主要给大家说几个坑吧,可能大家在调试也会出现的情况
1.IP和端口就不说了,根据自己的工程进行修改就行了,那么重点就要说下这个用户名和密码的问题了,刚开是和FTP搭建的人员调试的时候,说的是没有用户名和密码,所以开始我就没有传这两个字段,但是老是调试不通,通过查资料才确定ftp是有默认用户名的anonymous,所以在没有用户名和密码的时候请用默认用户名,然后就是密码也必须随便填一个,不能传空字符,不然可能还是不会通。
3.调用代码
new Thread(new Runnable() {
@Override
public void run() {
// TODO 可以首先去判断一下网络
FTPUtils ftpClient = new FTPUtils();
boolean connectResult = ftpClient.ftpConnect(PostAlarmActivity.this);
if (connectResult) {
boolean uploadResult = ftpClient.ftpUpload(url, VIDEO_UPLOAD_FILE + name);
if (uploadResult) {
Log.w(TAG, "上传成功");
boolean disConnectResult = ftpClient.ftpDisconnect();
if (disConnectResult) {
Log.e(TAG, "关闭ftp连接成功");
runOnUiThread(new Runnable() {
@Override
public void run() {
submit(url, name, 1);
}
});
} else {
Log.e(TAG, "关闭ftp连接失败");
}
} else {
Log.w(TAG, "上传失败");
runOnUiThread(new Runnable() {
@Override
public void run() {
ToastUtil.show(PostAlarmActivity.this, "视频上传失败");
}
});
}
} else {
Log.w(TAG, "连接ftp服务器失败");
}
}
}).start();
public static final String VIDEO_UPLOAD_FILE = "./";
这里的url就是文件源文件路劲,然后这个调用这里也有一个坑,就是这个文件名称是指你要上传的位置,这里前面必须指定上传的文件目录加上你要保存的文件名,"./"表示根目录,name是文件名,如果要上传指定目录,只要确保FTP服务器有就OK了。