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

来源:互联网 发布:天刀丐帮捏脸数据男 编辑:程序博客网 时间:2024/06/05 17:52

参考原文链接地址:

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


3Demo例程源码

[在工程中建立一个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 {//buttonsprivate Button buttonUpLoad = null;private Button buttonDownLoad=null;//FTP工具类private FTPUtils ftpUtils = null;@Overrideprotected 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");}  @Overridepublic 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 FTPUrlFTP服务器IP地址 * @param FTPPortFTP服务器端口号 * @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 exceptionLog.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中的值,也需要在valuesstrings.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.mp4SD卡的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.mp4SD卡的ftpdata文件夹下,代码为:

  ftpUtils.downLoadFile("/sdcard/data/ceshi.mp4", "ceshi.mp4"); 













原创粉丝点击