您的位置:首页 > 移动开发 > Android开发

Android开发 之 利用commons-net-3.0.1.jar包实现FTP上传下载功能

2013-10-16 15:44 836 查看
参考原文链接地址:

http://blog.csdn.net/ljphhj/article/details/11859593#comments

感谢作者:胖虎 无私的提供Demo,以及其在我实现过程中的指导!谢谢!

1、搭建环境
本文实现的Android访问FTP服务器,实现上传和下载的功能
是利用的Apache公司出的commons-net-3.0.1.jar包。
关于jar包的引用,可以参看我的另外一个博客。
http://blog.csdn.net/liuyixin01/article/details/12685067

2、关于FTP服务器
本文的测试FTP是在自己电脑(内部局域网)上利用Serv-U搭建的环境。
FTP服务器地址:219.231.164.115
FTP服务器断口:21
登陆账号:yixin
登陆密码:yixin

3、Demo例程源码
[在工程中建立一个Activity,起名为:FtpActivity]
[在工程中建立一个class,起名为:FTPUtils]
主Activity:FtpActivity

package com.example.ftptest_apache;

import java.security.PublicKey;

import android.R.anim;
import android.os.Bundle;
import android.os.StrictMode;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

/*
* 1.文件上传到FTP服务器
* 2.从FTP服务器上下载文件
*/
public class FtpActivity extends Activity implements OnClickListener {
//buttons
private Button buttonUpLoad = null;
private Button buttonDownLoad=null;

//FTP工具类
private FTPUtils ftpUtils = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ftp);

//获取控件对象
buttonUpLoad=(Button)findViewById(R.id.button_1);
buttonDownLoad=(Button)findViewById(R.id.button_2);

//设置控件相应函数
buttonUpLoad.setOnClickListener(this);
buttonDownLoad.setOnClickListener(this);

//搭建环境的API Level必须大于等于9
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}

//初始化和FTP服务器交互的类
InitFTPServerSetting();

}

public void InitFTPServerSetting() {
ftpUtils = FTPUtils.getInstance();
boolean flag = ftpUtils.initFTPSetting("219.231.164.115", 21, "yixin", "yixin");
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button_1:{
//上传文件
ftpUtils.uploadFile("/sdcard/ftpdata/ceshi.mp4", "ceshi.mp4");
}break;

case R.id.button_2:{
//下载文件
//参数为:要存放的文件路径和远程FTP文件名字
ftpUtils.downLoadFile("/sdcard/ftpdata/ceshi.mp4", "ceshi.mp4");
}break;

default:
break;
}
}

}


工具类:FTPUtils

package com.example.ftptest_apache;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
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 android.R.string;
import android.graphics.Bitmap.Config;
import android.nfc.Tag;
import android.util.Log;

/*
* 用于Android和FTP服务器进行交互的工具类
*/

public class FTPUtils {
private static final String Tag = null;

private FTPClient ftpClient = null;
private static FTPUtils ftpUtilsInstance = null;
private String FTPUrl;
private int FTPPort;
private String UserName;
private String UserPassword;

private FTPUtils() {
ftpClient = new FTPClient();
}

/* 得到类对象实例  */
public static FTPUtils getInstance() {
if (ftpUtilsInstance == null) {
ftpUtilsInstance = new FTPUtils();
}
return ftpUtilsInstance;
}

/*
* 设置FTP服务器
* @param FTPUrl		FTP服务器IP地址
* @param FTPPort		FTP服务器端口号
* @param UserName		登陆FTP服务器的账号
* @param UserPassword  登陆FTP服务器的密码
*/
public boolean initFTPSetting(String FTPUrl,int FTPPort,String UserName,String UserPassword) {
this.FTPUrl = FTPUrl;
this.FTPPort= FTPPort;
this.UserName=UserName;
this.UserPassword=UserPassword;

int reply;

try {
//1.要连接的FTP服务器的地址、端口
ftpClient.connect(FTPUrl,FTPPort);

//2.登陆FTP服务器
ftpClient.login(UserName, UserPassword);

//3.看返回值是不是230,如果是,表示登陆成功
reply = ftpClient.getReplyCode();

if (!FTPReply.isPositiveCompletion(reply)) {
//断开连接
ftpClient.disconnect();
return false;
}

return true;
} catch (SocketException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}

/*
*   上传文件
*   @param FilePath	要上传文件所在的SDCard的路径
*   @param FileName	要上传文件的文件名(如:SIM的唯一标识码)
*   @return  true为成功, false为失败
*/
public boolean uploadFile(String FilePath,String FileName) {
//判断FTP是否仍在连接
if (!ftpClient.isConnected()) {
if (!initFTPSetting(FTPUrl, FTPPort, UserName, UserPassword)) {
return false;
}
}

try {
//1.设置存储路径
ftpClient.makeDirectory("/ftpdata");
ftpClient.changeWorkingDirectory("/ftpdata");

//2.设置上传文件需要的一些基本信息
ftpClient.setBufferSize(1024);
ftpClient.setControlEncoding("UTF-8");
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

//3.文件上传
FileInputStream fileInputStream = new FileInputStream(FilePath);
ftpClient.storeFile(FileName, fileInputStream);

//4.关闭文件流
fileInputStream.close();

//5.退出登录FTP,关闭ftpClient连接
ftpClient.logout();
ftpClient.disconnect();

} catch (IOException e) {
Log.d(Tag, "UpLoad failed"); //输出错误消息
e.printStackTrace();
return false;
}
return false;
}

/*
* 下载文件
* @param FilePath 要存放的文件路径
* @param FileName 远程FTP服务器上的那个文件的名字
* @return  true为成功, false为失败
*/
public boolean downLoadFile(String FilePath,String FileName) {
//判断FTP是否仍在连接
if (!ftpClient.isConnected()) {
if (!initFTPSetting(FTPUrl, FTPPort, UserName, UserPassword)) {
return false;
}
}

try {
//1.转到指定的下载目录
ftpClient.changeWorkingDirectory("/ftpdata");

//2.列出该目录下的所有文件
FTPFile[] files = ftpClient.listFiles();

//3.遍历所有文件,找到指定的文件
for (FTPFile file : files) {
String fileName = file.getName();
if (file.getName().equals(FileName)) {
//根据绝对路径初始化文件
File localFile = new File(FilePath);

//输出流
FileOutputStream outputStream = new FileOutputStream(localFile);

//下载文件
ftpClient.retrieveFile(file.getName(), outputStream);
//关闭流
outputStream.close();

}
}

//4.退出登录FTP,关闭ftpClient的连接
ftpClient.logout();
ftpClient.disconnect();

} catch (IOException e) {
// TODO: handle exception
Log.d(Tag, "DownLoad failed");
e.printStackTrace();
return false;
}
return true;
}

}


4、配置Android XML文件

a/设置Button信息,对layout中的activity_ftp.xml进行修改,加入按键

<Button
android:id="@+id/button_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/UpLoad"/>

<Button
android:id="@+id/button_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/DownLoad"  />

b/由于用到了String中的值,也需要在values的strings.xml 中加入字符名

  <string name="UpLoad">UpLoad</string>
<string name="DownLoad">DownLoad</string>


c/对安卓程序加入访问Internet权限,对AndroidManifest.xml进行修改

<uses-permission android:name="android.permission.INTERNET" />


d/对安卓程序加入读写SD卡权限,对AndroidManifest.xml进行修改

  <uses-permission 		android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


5、注意事项

a/FTPUtils类中uploadFile方法的调用

*   上传文件
*   @param FilePath要上传文件所在的SDCard的路径
*   @param FileName要上传文件的文件名(如:SIM的唯一标识码)
*   @return  true为成功, false为失败
*/
public boolean uploadFile(String FilePath,String FileName)


比如要上传到ftp根目录下的ftpdata文件夹下,要上传的文件ceshi.mp4在SD卡的ftpdata文件夹下,代码为:

ftpUtils.uploadFile("/sdcard/ftpdata/ceshi.mp4", "ceshi.mp4");

b/FTPUtils类中downLoadFile方法的调用

* 下载文件
* @param FilePath 要存放的文件路径
* @param FileName 远程FTP服务器上的那个文件的名字
* @return  true为成功, false为失败
public boolean downLoadFile(String FilePath,String FileName)

比如我要下载ftp根目录下的ftpdata文件夹下ceshi.mp4到SD卡的ftpdata文件夹下,代码为:

ftpUtils.downLoadFile("/sdcard/data/ceshi.mp4", "ceshi.mp4");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐