[Android中级]使用Commons-net-ftp来实现FTP上传、下载的功能
利用业余时间。学习一些实用的东西,假设手又有点贱的话。最好还是自己也跟着敲起来。
在android上能够通过自带的ftp组件来完毕各种功能。这次是由于项目中看到用了Commons-net-ftp的包完毕的,所以就以此试试手。
首先,代码中有所參考借鉴了:Android中使用Apache common
ftp进行下载文件 博文
这次是分享关于在android上使用FTP协议(文件传输协议)进行文件的下载、上传的功能。我们能够先了解一下,FTP和HTTP一样都是Internet上广泛使用的协议。用来在两台计算机之间互相传送文件。
相比于HTTP。FTP协议要复杂得多。复杂的原因,是由于FTP协议要用到两个TCP连接,一个是命令链路,用来在FTPclient与server之间传递命令;还有一个是数据链路,用来上传或下载数据。
1.为了測试FTP服务。本文中使用的是filezilla server 程序 模拟的。
https://filezilla-project.org/
这里就不说怎么安装的了,简单就是设置ip和用户权限什么的。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
2.demo的结构,一如既往,红框内的是重点。jar包可在Apache上下载(http://commons.apache.org/proper/commons-net/download_net.cgi)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
3.主界面和源码
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
MainActivity.java (代码非常粗糙,但将就着看吧)
/**
* ftp demo的主界面
* @author jan
*
*/
public class MainActivity extends Activity implements OnClickListener {
private static final String TAG = "MainActivity";
private static final int SHOW_DIALOG = 1000;
private static final int HIDE_DIALOG = 1001;
private Button mLoginButton;
private EditText mUserEt;
private EditText mPasswordEt;
private Button mDownloadBtn;
private Button mUploadBtn; private FTPManager mFtpManager;
private InputMethodManager mImm;
private ProgressDialog mProgressDialog;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == SHOW_DIALOG) {
showProgressDialog(msg.obj == null ? "请等待..." : msg.obj
.toString());
} else if (msg.what == HIDE_DIALOG) {
hideProgressDialog();
}
}
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
mImm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
initView();
FTPConfig config = new FTPConfig("192.168.1.29", 21);
config.user = "jan";
config.pwd = "123456";
mUserEt.setText(config.user);
mPasswordEt.setText(config.pwd);
mFtpManager = FTPManager.getInstance(config);
} private void initView() {
mLoginButton = (Button) findViewById(R.id.login_button);
mLoginButton.setOnClickListener(this);
mUserEt = (EditText) findViewById(R.id.username_et);
mPasswordEt = (EditText) findViewById(R.id.password_et);
mDownloadBtn = (Button) findViewById(R.id.button1);
mDownloadBtn.setOnClickListener(this);
mUploadBtn = (Button) findViewById(R.id.button2);
mUploadBtn.setOnClickListener(this);
} private void showProgressDialog(String content) {
if (mProgressDialog == null) {
mProgressDialog = new ProgressDialog(this,
ProgressDialog.STYLE_HORIZONTAL);
}
mProgressDialog.setTitle("提示信息");
mProgressDialog.setMessage(content);
mProgressDialog.setCancelable(false);
mProgressDialog.show();
} private void hideProgressDialog() {
if (mProgressDialog != null) {
mProgressDialog.dismiss();
}
} @Override
protected void onDestroy() {
super.onDestroy();
new Thread() {
@Override
public void run() {
mFtpManager.close();
}
}.start();
ToastUtil.cancel();
} @Override
public void onClick(View v) {
switch (v.getId()) {
// 连接和登陆測试
case R.id.login_button:
loginFtp();
break;
// 下载ftp上的指定文件
case R.id.button1:
downloadFile();
break;
// 上传android上的指定的文件到ftpserver
case R.id.button2:
uoloadFile();
break;
}
} /**
* 登陆功能測试
*/
private void loginFtp() {
mImm.hideSoftInputFromWindow(mPasswordEt.getWindowToken(), 0);
if (StringUtils.isEmpty(mUserEt.getText().toString().trim())) {
ToastUtil.showShortToast(this, "账号不能为空");
return;
}
if (StringUtils.isEmpty(mPasswordEt.getText().toString().trim())) {
ToastUtil.showShortToast(this, "密码不能为空");
return;
}
new Thread() {
@Override
public void run() {
Log.d(TAG, "start login!");
if (mFtpManager.connectFTPServer()) {
Log.d(TAG, "connectFTPServer = true");
//查看远程FTP上的文件
FTPFile[] files = mFtpManager.getFTPFiles();
Log.i(TAG, "files.size="+files.length);
for(FTPFile f:files){
Log.i(TAG, "file:"+f.getName());
}
ToastUtil.showShortToast(MainActivity.this, "连接ftp成功", true);
}else{
Log.d(TAG, "connectFTPServer = false");
}
}
}.start();
}
/**
* 获取一个下载存放文件的文件夹
* @return
*/
public String getSDPath() {
File sdDir = null;
boolean sdCardExist = Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED); // 推断sd卡是否存在
if (sdCardExist) {
sdDir = Environment.getExternalStorageDirectory();// 获取跟文件夹
}
return sdDir.toString();
} /**
* 下载功能的測试
*/
private void downloadFile() {
new Thread() {
@Override
public void run() {
String localPath = getSDPath();
if (!StringUtils.isEmpty(localPath)) {
localPath = localPath + "/ftp_demo.log";
} else {
localPath = getApplicationContext().getFilesDir()
.getAbsolutePath() + "/ftp_demo.log";
}
Log.d(TAG, "localPath=" + localPath);
mFtpManager.setRetrieveListener(new IRetrieveListener() {
@Override
public void onTrack(long curPos) {
Log.d(TAG, "--onTrack--" + curPos);
} @Override
public void onStart() {
Log.d(TAG, "--onStart--");
mHandler.sendEmptyMessage(SHOW_DIALOG);
} @Override
public void onError(int code, String msg) {
Log.e(TAG, "download error:" + msg);
mHandler.sendEmptyMessage(HIDE_DIALOG);
ToastUtil.showShortToast(getApplicationContext(), "下载失败",
true);
} @Override
public void onDone() {
Log.i(TAG, "download success");
mHandler.sendEmptyMessage(HIDE_DIALOG);
ToastUtil.showShortToast(MainActivity.this, "下载成功",
true);
} @Override
public void onCancel() {
Log.i(TAG, "download onCancel");
mHandler.sendEmptyMessage(HIDE_DIALOG);
}
});
mFtpManager.downLoadFile("/ftp_test.log", localPath);
}
}.start();
}
/**
* 上传操作
*/
private void uoloadFile() {
new Thread(new Runnable() {
@Override
public void run() {
String localPath = getSDPath();
if (!StringUtils.isEmpty(localPath)) {
localPath = localPath + "/ftp_demo.log";
} else {
localPath = getApplicationContext().getFilesDir()
.getAbsolutePath() + "/ftp_demo.log";
}
Log.d(TAG, "localPath=" + localPath);
File file = new File(localPath);
try {
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(file, false);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos, "utf-8"));
bw.write("FTP上传測试用例");
bw.flush();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
mFtpManager.setRetrieveListener(new IRetrieveListener() {
@Override
public void onTrack(long curPos) {
Log.d(TAG, "upload--onTrack--" + curPos);
} @Override
public void onStart() {
Log.d(TAG, "upload--onStart--");
Message msg = mHandler.obtainMessage(SHOW_DIALOG);
msg.obj = "正在上传...";
mHandler.sendMessage(msg);
} @Override
public void onError(int code, String msg) {
Log.e(TAG, "upload error:" + msg);
mHandler.sendEmptyMessage(HIDE_DIALOG);
ToastUtil.showShortToast(MainActivity.this, "上传失败",
true);
} @Override
public void onDone() {
Log.i(TAG, "upload success");
mHandler.sendEmptyMessage(HIDE_DIALOG);
ToastUtil.showShortToast(MainActivity.this, "上传成功",true);
} @Override
public void onCancel() {
Log.i(TAG, "upload onCancel");
mHandler.sendEmptyMessage(HIDE_DIALOG);
}
});
mFtpManager.uploadFile(localPath, "ftp_up.log");
}
}).start();
}
}
4.FtpManager.java
package org.jan.ftp.utils; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException; import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.commons.net.ftp.FTPSClient;
import org.apache.commons.net.util.TrustManagerUtils;
import org.jan.ftp.demo.bean.FTPConfig; import android.util.Log; /**
* FTP client管理类
*
* @author jan
*/
public class FTPManager {
private static final String TAG = "FTPManager";
private static FTPManager mFtpManager;
private FTPClient mFtpClient;
private FTPSClient mFtpsClient;
private static FTPConfig mConfig;
private IRetrieveListener retrieveListener;
private boolean isFTPS = false;
volatile boolean isLogin = false;
volatile boolean isStopDownload = false; private FTPManager() {
mFtpClient = new FTPClient();
mFtpsClient = new FTPSClient(false);
mFtpsClient.setTrustManager(TrustManagerUtils
.getAcceptAllTrustManager());
} public static FTPManager getInstance(FTPConfig cfg) {
if (mFtpManager == null) {
mFtpManager = new FTPManager();
}
mConfig = cfg;
return mFtpManager;
} public static FTPManager getInstance(String host, int port) {
if (mFtpManager == null) {
mFtpManager = new FTPManager();
}
mConfig = new FTPConfig(host, port);
return mFtpManager;
} public void setRetrieveListener(IRetrieveListener retrieveListener) {
this.retrieveListener = retrieveListener;
} /**
* 连接并登陆ftp服务
*
* @return
*/
public boolean connectFTPServer() {
try {
FTPClientConfig ftpClientCfg = new FTPClientConfig(
FTPClientConfig.SYST_UNIX);
ftpClientCfg.setLenientFutureDates(true);
mFtpClient.configure(ftpClientCfg);
mFtpClient.setConnectTimeout(15000);
mFtpClient.connect(mConfig.ipAdress, mConfig.port);
login();
int replyCode = mFtpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(replyCode)) {
mFtpClient.disconnect();
return false;
}
} catch (SocketException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 登陆ftp服务端
* @return
*/
public boolean login() {
try {
if (mFtpClient.isConnected()) {
boolean isLogin = mFtpClient.login(mConfig.user, mConfig.pwd);
if (!isLogin) {
return false;
}
mFtpClient.setControlEncoding("GBK");
mFtpClient.setFileType(FTPClient.FILE_STRUCTURE);
mFtpClient.enterLocalActiveMode();
// mFtpClient.enterRemotePassiveMode();
// mFtpClient.enterRemoteActiveMode(
// InetAddress.getByName(mConfig.ipAdress), mConfig.port);
mFtpClient.setFileType(FTP.BINARY_FILE_TYPE);
return isLogin;
}
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
/**
* 退出并关闭本次连接
*/
public void close() {
try {
if (mFtpClient.isConnected()) {
mFtpClient.logout();
}
mFtpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 下载FTP上的文件
* @param remoteFileName
* @param localFileName
* @param currentSize
*/
public void downLoadFile(String remoteFileName, String localFileName,
long currentSize) {
Log.i(TAG, "downloadFile fileName=" + remoteFileName + " currentSize="
+ currentSize);
if (retrieveListener != null) {
retrieveListener.onStart();
}
byte[] buffer = new byte[mConfig.bufferSize];
int len = -1;
long now = -1;
boolean append = false;
if (mFtpClient != null) {
InputStream ins = null;
FileOutputStream fos = null;
try {
File localFile = new File(localFileName);
if (currentSize > 0) {
mFtpClient.setRestartOffset(currentSize);
now = currentSize;
append = true;
}
ins = getRemoteFileStream(remoteFileName);
fos = new FileOutputStream(localFile, append);
if (ins == null) {
throw new FileNotFoundException("remote file is not exist");
}
while ((len = ins.read(buffer)) != -1) {
if (isStopDownload) {
break;
}
fos.write(buffer, 0, len);
now += len;
retrieveListener.onTrack(now); }
if (isStopDownload) {
retrieveListener.onCancel();
} else {
if (mFtpClient.completePendingCommand()) {
retrieveListener.onDone();
} else {
retrieveListener.onError(ERROR.DOWNLOAD_ERROR,
"download fail");
}
}
} catch (FileNotFoundException e) {
retrieveListener.onError(ERROR.FILE_NO_FOUNT, "download fail:"
+ e);
} catch (IOException e) {
retrieveListener.onError(ERROR.IO_ERROR, "download fail:" + e);
} finally {
try {
ins.close();
fos.close();
} catch (Exception e2) {
}
}
}
}
/**
* 下载FTPserver上的指定文件到本地
* @param remotePath
* @param localPath
*/
public void downLoadFile(String remotePath, String localPath) {
downLoadFile(remotePath, localPath, -1);
} private InputStream getRemoteFileStream(String remoteFilePath) {
InputStream is = null;
try {
is = mFtpClient.retrieveFileStream(remoteFilePath);
} catch (IOException e) {
e.printStackTrace();
}
return is;
}
/**
* 上传文件
* @param localPath 本地须要上传的文件路径(包含后缀名)
* @param workDirectory 上传ftpserver上的指定文件文件夹
* @param desFileName 目标文件名称
* @return
*/
public boolean uploadFile(String localPath, String workDirectory,
String desFileName) {
Log.i(TAG, "uploadFile localPath=" + localPath + " desFileName="
+ desFileName);
if (retrieveListener != null) {
retrieveListener.onStart();
}
try {
if (mFtpClient != null && mFtpClient.isConnected()) {
// 设置存储路径
mFtpClient.makeDirectory(workDirectory);
mFtpClient.changeWorkingDirectory(workDirectory);
mFtpClient.setBufferSize(1024); FileInputStream fis = new FileInputStream(localPath);
boolean isUploadSuccess = mFtpClient
.storeFile(desFileName, fis);
if (isUploadSuccess) {
if (retrieveListener != null) {
retrieveListener.onDone();
}
} else {
if (retrieveListener != null) {
retrieveListener.onError(ERROR.UPLOAD_ERROR,
"upload fail");
}
}
fis.close();
return isUploadSuccess;
}
} catch (IOException e) {
e.printStackTrace();
if (retrieveListener != null) {
retrieveListener.onError(ERROR.IO_ERROR, "upload error:" + e);
}
}
return false;
} /**
* 上传文件到目的ftp服务端根文件夹下
*
* @param localFileName
* 待上传的源文件
* @param remoteFileName
* 服务端的文件名称称
* @return 上传成功的标识
*/
public boolean uploadFile(String localFileName, String remoteFileName) {
return uploadFile(localFileName, "/", remoteFileName);
} public FTPFile[] getFTPFiles() {
try {
if(!mFtpClient.isConnected()){
return null;
}
mFtpClient.changeToParentDirectory();
return mFtpClient.listFiles();
} catch (IOException e) {
e.printStackTrace();
}
return null;
} public boolean deleteFile(String pathname){
try {
return mFtpClient.deleteFile(pathname);
} catch (IOException e) {
e.printStackTrace();
}
return false;
} public boolean createDirectory(String pathname){
try {
return mFtpClient.makeDirectory(pathname);
} catch (IOException e) {
e.printStackTrace();
}
return false;
} public FTPFile[] getFTPFiles(String remoteDir) {
try {
if(!mFtpClient.isConnected()){
return null;
}
return mFtpClient.listFiles(remoteDir);
} catch (IOException e) {
e.printStackTrace();
}
return null;
} public boolean isStopDownload() {
return isStopDownload;
} public void setStopDownload(boolean isStopDownload) {
this.isStopDownload = isStopDownload;
} public boolean isFTPS() {
return isFTPS;
} public void setFTPS(boolean isFTPS) {
if (isFTPS) {
mFtpClient = mFtpsClient;
} else {
mFtpClient = new FTPClient();
}
this.isFTPS = isFTPS;
} public interface IRetrieveListener {
public void onStart(); public void onTrack(long curPos); public void onError(int errorCode, String errorMsg); public void onCancel(); public void onDone();
} public static class ERROR {
public static final int FILE_NO_FOUNT = 4000;
public static final int FILE_DOWNLOAD_ERROR = 4001;
public static final int LOGIN_ERROR = 4002;
public static final int CONNECT_ERROR = 4003;
public static final int IO_ERROR = 4004;
public static final int DOWNLOAD_ERROR = 4005;
public static final int UPLOAD_ERROR = 4006;
}
}
使用起来事实上非常easy吧!
假设须要demo的话,请自行下载哦。
[Android中级]使用Commons-net-ftp来实现FTP上传、下载的功能的更多相关文章
- 我的代码库-Java8实现FTP与SFTP文件上传下载
有网上的代码,也有自己的理解,代码备份 一般连接windows服务器使用FTP,连接linux服务器使用SFTP.linux都是通过SFTP上传文件,不需要额外安装,非要使用FTP的话,还得安装FTP ...
- Java实现FTP与SFTP文件上传下载
添加依赖Jsch-0.1.54.jar <!-- https://mvnrepository.com/artifact/com.jcraft/jsch --> <dependency ...
- Java实现FTP批量大文件上传下载篇1
本文介绍了在Java中,如何使用Java现有的可用的库来编写FTP客户端代码,并开发成Applet控件,做成基于Web的批量.大文件的上传下载控件.文章在比较了一系列FTP客户库的基础上,就其中一个比 ...
- Android开发中使用七牛云存储进行图片上传下载
Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储 ...
- Android和FTP服务器交互,上传下载文件(实例demo)
今天同学说他备份了联系人的数据放在一个文件里,想把它存到服务器上,以便之后可以进行下载恢复..于是帮他写了个上传,下载文件的demo 主要是 跟FTP服务器打交道-因为这个东东有免费的可以身亲哈 1. ...
- java操作FTP,实现文件上传下载删除操作
上传文件到FTP服务器: /** * Description: 向FTP服务器上传文件 * @param url FTP服务器hostname * @param port FTP服务器端口,如果默认端 ...
- linux命令行模式下对FTP服务器进行文件上传下载
参考源:点击这里查看 1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码 ...
- yii2 ftp 的常规操作 上传 下载
<?php function make_directory($ftp_stream, $dir){ // if directory already exists or can be immedi ...
- 记crt 在windows与linux服务器之间利用ftp进行文件的上传下载
我们首先来熟悉一些相关的命令以及操作: ls #展示linux服务器当前工作目录[你连接sftp时所处的目录]下的所有文件以及文件夹 lcd F:\niki #绑定你在windo ...
- FTP服务器搭建以及上传下载的学习
首先需要搭建FTP服务步骤如下: 1.在win7上先开启ftp服务:这里点击确定后,可能会要等一会儿,完成后有时系统会提示重启 2.打开 计算机-->管理--> 在这里我们可以看见 ...
随机推荐
- bzoj1833: [ZJOI2010]count 数字计数(数位DP+记忆化搜索)
1833: [ZJOI2010]count 数字计数 题目:传送门 题解: 今天是躲不开各种恶心DP了??? %爆靖大佬啊!!! 据说是数位DP裸题...emmm学吧学吧 感觉记忆化搜索特别强: 定义 ...
- The Triangle--nyoj 18
The Triangle 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure ...
- [SPOJ 30669] Ada and Trip
[题目链接] https://www.spoj.com/problems/ADATRIP/ [算法] 直接使用dijkstra堆优化算法即可 [代码] #include<bits/stdc++. ...
- Android平台下的TCP/IP传输(客户端)
在工科类项目中,嵌入式系统与软件系统或后台数据库之间的信息传输是实现“物联网”的一种必要的途径,对已简单概念的物联网,通常形式都是一个单片机/嵌入式系统实现数据的采集及其处理,通过蓝牙,wifi或者是 ...
- 10-XML
今日知识 1. xml * 概念 * 语法 * 解析 xml概念 1. 概念:Extensible Markup Language 可扩展标记语言 * 可扩展:标签都是自定义的. <user&g ...
- maven 打包jar && lib
一.springboot 打包成jar 1.pom.xml <build> <!-- jar的名称--> <finalName>shiro</finalNam ...
- Django中的session和cookie及分页设置
cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...
- python之路——二分查找算法
楔子 如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做? l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72 ...
- 了解jQuery的$符号
$是什么? 可以使用typeof关键字来观察$的本质. console.log(type of $); //输出结果为function 因此可以得出结论,$其实就是一个函数.$(); 只是根据所给参数 ...
- 【C】一些字符串处理函数
1.复制函数 我更愿意称之为”字符串覆盖函数” a. strcpy(str1,str2); 将字符串str2 覆盖到str1上 b. strncpy(str1,str2,n); 2.拼接函数 a. s ...