Android使用ftp方式实现文件上传和下载

近期在工作上一直再维护平台OTA在线升级项目,其中关于这个升级文件主要是存放于ftp服务器上的,然后客户端通过走ftp协议方式下载至本地Android机进行一个系统升级操作。那么今天将对ftp实现文件上传和下载进行一个使用总结,关于ftp这方面的理论知识如果不是太了解的各位道友,那么请移步HTTP和FTP的区别的一些理论知识 作个具体的了解或者查阅相关资料。那么先看看个人工作项目这个OTA升级效果图吧。如下:

下面是具体的接口实现:

那么相关ftp的操作,已经被封装到ota.ftp这个包下,各位童鞋可以下载示例代码慢慢研究。另外这个要是用ftp服务我们cline端需要再项目工程导入ftp4j-1.7.2.jar包

这边作个使用的逻辑分析:首先在我们的项目工程FtpApplication中启动这个OtaService,其中OtaService作为一个服务运行起来,在这个服务里面拿到封装好ftp相关接口的DownLoad.java进行ftp文件操作,关键代码如下:

public void startDownload() {
    // TODO Auto-generated method stub
    mDownLoad.start();
  }

  public void stopDownload() {
    mDownLoad.stop();
  }

  public void cancel() {
    mDownLoad.cancel();
  }

  public String getOldDate() {
    return mDownLoad.getDatabaseOldDate();
  }

  public String getOldVersion() {
    return mDownLoad.getDatabaseOldVersion();
  }

  public void checkVer(String serverRoot) {
    // TODO Auto-generated method stub
    mDownLoad = DownLoad.getInstance();
    mDownLoad.setServeRoot(serverRoot);
    mDownLoad.setFtpInfo(mApp.mFtpInfo);
    mDownLoad.checkUpgrade();
  }

FTPToolkit.java

package com.asir.ota.ftp;

import it.sauronsoftware.ftp4j.FTPClient;
import it.sauronsoftware.ftp4j.FTPFile;

import java.io.File;
import java.util.List;

import com.asir.ota.clinet.PathToolkit;
import com.asir.ota.ftp.DownLoad.MyFtpListener;

/**
 * FTP客户端工具
 *
 */
public final class FTPToolkit {

  private FTPToolkit() {
  }

  /**
   * 创建FTP连接
   *
   * @param host
   *      主机名或IP
   * @param port
   *      ftp端口
   * @param username
   *      ftp用户名
   * @param password
   *      ftp密码
   * @return 一个客户端
   * @throws Exception
   */
  public static FTPClient makeFtpConnection(String host, int port,
      String username, String password) throws Exception {
    FTPClient client = new FTPClient();
    try {
      client.connect(host, port);
      if(username != null && password != null) {
        client.login(username, password);
      }
    } catch (Exception e) {
      throw new Exception(e);
    }
    return client;
  }
/**
   * FTP下载文件到本地一个文件夹,如果本地文件夹不存在,则创建必要的目录结构
   *
   * @param client
   *      FTP客户端
   * @param remoteFileName
   *      FTP文件
   * @param localPath
   *      存的本地文件路径或目录
   * @throws Exception
   */
  public static void download(FTPClient client, String remoteFileName,
      String localPath, long startPoint, MyFtpListener listener) throws Exception {

    String localfilepath = localPath;
    int x = isExist(client, remoteFileName);
    File localFile = new File(localPath);
    if (localFile.isDirectory()) {
      if (!localFile.exists())
        localFile.mkdirs();
      localfilepath = PathToolkit.formatPath4File(localPath
          + File.separator + new File(remoteFileName).getName());
    }

    if (x == FTPFile.TYPE_FILE) {
      try {
        if (listener != null)
          client.download(remoteFileName, new File(localfilepath),
              startPoint, listener);
        else
          client.download(remoteFileName, new File(localfilepath), startPoint);
      } catch (Exception e) {
        throw new Exception(e);
      }
    } else {
      throw new Exception("the target " + remoteFileName + "not exist");
    }
  }
/**
   * FTP上传本地文件到FTP的一个目录下
   *
   * @param client
   *      FTP客户端
   * @param localfile
   *      本地文件
   * @param remoteFolderPath
   *      FTP上传目录
   * @throws Exception
   */
  public static void upload(FTPClient client, File localfile,
      String remoteFolderPath, MyFtpListener listener) throws Exception {
    remoteFolderPath = PathToolkit.formatPath4FTP(remoteFolderPath);
    try {
      client.changeDirectory(remoteFolderPath);
      if (!localfile.exists())
        throw new Exception("the upload FTP file"
            + localfile.getPath() + "not exist!");
      if (!localfile.isFile())
        throw new Exception("the upload FTP file"
            + localfile.getPath() + "is a folder!");
      if (listener != null)
        client.upload(localfile, listener);
      else
        client.upload(localfile);
      client.changeDirectory("/");
    } catch (Exception e) {
      throw new Exception(e);
    }
  }

/**
   * FTP上传本地文件到FTP的一个目录下
   *
   * @param client
   *      FTP客户端
   * @param localfilepath
   *      本地文件路径
   * @param remoteFolderPath
   *      FTP上传目录
   * @throws Exception
   */
  public static void upload(FTPClient client, String localfilepath,
      String remoteFolderPath, MyFtpListener listener) throws Exception {
    File localfile = new File(localfilepath);
    upload(client, localfile, remoteFolderPath, listener);
  }

/**
   * 批量上传本地文件到FTP指定目录上
   *
   * @param client
   *      FTP客户端
   * @param localFilePaths
   *      本地文件路径列表
   * @param remoteFolderPath
   *      FTP上传目录
   * @throws Exception
   */
  public static void uploadListPath(FTPClient client,
      List<String> localFilePaths, String remoteFolderPath, MyFtpListener listener) throws Exception {
    remoteFolderPath = PathToolkit.formatPath4FTP(remoteFolderPath);
    try {
      client.changeDirectory(remoteFolderPath);
      for (String path : localFilePaths) {
        File file = new File(path);
        if (!file.exists())
          throw new Exception("the upload FTP file" + path + "not exist!");
        if (!file.isFile())
          throw new Exception("the upload FTP file" + path
              + "is a folder!");
        if (listener != null)
          client.upload(file, listener);
        else
          client.upload(file);
      }
      client.changeDirectory("/");
    } catch (Exception e) {
      throw new Exception(e);
    }
  }
/**
   * 批量上传本地文件到FTP指定目录上
   *
   * @param client
   *      FTP客户端
   * @param localFiles
   *      本地文件列表
   * @param remoteFolderPath
   *      FTP上传目录
   * @throws Exception
   */
  public static void uploadListFile(FTPClient client, List<File> localFiles,
      String remoteFolderPath, MyFtpListener listener) throws Exception {
    try {
      client.changeDirectory(remoteFolderPath);
      remoteFolderPath = PathToolkit.formatPath4FTP(remoteFolderPath);
      for (File file : localFiles) {
        if (!file.exists())
          throw new Exception("the upload FTP file" + file.getPath()
              + "not exist!");
        if (!file.isFile())
          throw new Exception("the upload FTP file" + file.getPath()
              + "is a folder!");
        if (listener != null)
          client.upload(file, listener);
        else
          client.upload(file);
      }
      client.changeDirectory("/");
    } catch (Exception e) {
      throw new Exception(e);
    }
  }
/**
   * 判断一个FTP路径是否存在,如果存在返回类型(FTPFile.TYPE_DIRECTORY=1、FTPFile.TYPE_FILE=0、
   * FTPFile.TYPE_LINK=2) 如果文件不存在,则返回一个-1
   *
   * @param client
   *      FTP客户端
   * @param remotePath
   *      FTP文件或文件夹路径
   * @return 存在时候返回类型值(文件0,文件夹1,连接2),不存在则返回-1
   */
  public static int isExist(FTPClient client, String remotePath) {
    remotePath = PathToolkit.formatPath4FTP(remotePath);
    FTPFile[] list = null;
    try {
      list = client.list(remotePath);
    } catch (Exception e) {
      return -1;
    }
    if (list.length > 1)
      return FTPFile.TYPE_DIRECTORY;
    else if (list.length == 1) {
      FTPFile f = list[0];
      if (f.getType() == FTPFile.TYPE_DIRECTORY)
        return FTPFile.TYPE_DIRECTORY;
      // 假设推理判断
      String _path = remotePath + "/" + f.getName();
      try {
        int y = client.list(_path).length;
        if (y == 1)
          return FTPFile.TYPE_DIRECTORY;
        else
          return FTPFile.TYPE_FILE;
      } catch (Exception e) {
        return FTPFile.TYPE_FILE;
      }
    } else {
      try {
        client.changeDirectory(remotePath);
        return FTPFile.TYPE_DIRECTORY;
      } catch (Exception e) {
        return -1;
      }
    }
  }
public static long getFileLength(FTPClient client, String remotePath) throws Exception {
    String remoteFormatPath = PathToolkit.formatPath4FTP(remotePath);
    if(isExist(client, remotePath) == 0) {
      FTPFile[] files = client.list(remoteFormatPath);
      return files[0].getSize();

    }else {
      throw new Exception("get remote file length error!");
    }
  }

  /**
   * 关闭FTP连接,关闭时候像服务器发送一条关闭命令
   *
   * @param client
   *      FTP客户端
   * @return 关闭成功,或者链接已断开,或者链接为null时候返回true,通过两次关闭都失败时候返回false
   */

  public static boolean closeConnection(FTPClient client) {
    if (client == null)
      return true;
    if (client.isConnected()) {
      try {
        client.disconnect(true);
        return true;
      } catch (Exception e) {
        try {
          client.disconnect(false);
        } catch (Exception e1) {
          e1.printStackTrace();
          return false;
        }
      }
    }
    return true;
  }
}

包括登录,开始下载,取消下载,获取升级文件版本号和服务器版本校验等。其它的是一些数据库,SD卡文件相关操作,那么最后在我们下载完成之后需要对文件进行一个文件解压再执行升级操作,这部分在ZipExtractor.java和OTAProvider.java中实现

示例代码点击下载

总结

到此这篇关于Android使用ftp方式实现文件上传和下载的文章就介绍到这了,更多相关android ftp文件上传下载内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android使用ftp方式实现文件上传和下载

    近期在工作上一直再维护平台OTA在线升级项目,其中关于这个升级文件主要是存放于ftp服务器上的,然后客户端通过走ftp协议方式下载至本地Android机进行一个系统升级操作.那么今天将对ftp实现文件上传和下载进行一个使用总结,关于ftp这方面的理论知识如果不是太了解的各位道友,那么请移步HTTP和FTP的区别的一些理论知识 作个具体的了解或者查阅相关资料.那么先看看个人工作项目这个OTA升级效果图吧.如下: 下面是具体的接口实现: 那么相关ftp的操作,已经被封装到ota.ftp这个包下,各位

  • Android使用ftp方式实现文件上传和下载功能

    近期在工作上一直再维护平台OTA在线升级项目,其中关于这个升级文件主要是存放于ftp服务器上的,然后客户端通过走ftp协议方式下载至本地Android机进行一个系统升级操作.那么今天将对ftp实现文件上传和下载进行一个使用总结,关于ftp这方面的理论知识如果不是太了解的各位道友,那么请移步HTTP和FTP的区别的一些理论知识 作个具体的了解或者查阅相关资料.那么先看看个人工作项目这个OTA升级效果图吧.如下: 下面是具体的接口实现: 那么相关ftp的操作,已经被封装到ota.ftp这个包下,各位

  • Android关于FTP文件上传和下载功能详解

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 此篇博客为整理文章,供大家学习. 1.首先下载commons-net  jar包,可以百度下载. FTP的文件上传和下载的工具类: package ryancheng.example.progressbar; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.Outpu

  • Java实现FTP批量大文件上传下载篇1

    本文介绍了在Java中,如何使用Java现有的可用的库来编写FTP客户端代码,并开发成Applet控件,做成基于Web的批量.大文件的上传下载控件.文章在比较了一系列FTP客户库的基础上,就其中一个比较通用且功能较强的j-ftp类库,对一些比较常见的功能如进度条.断点续传.内外网的映射.在Applet中回调JavaScript函数等问题进行详细的阐述及代码实现,希望通过此文起到一个抛砖引玉的作用. 一.引子 笔者在实施一个项目过程中出现了一种基于Web的文件上传下载需求.在全省(或全国)各地的用

  • 基于python实现FTP文件上传与下载操作(ftp&sftp协议)

    前言 FTP(File Transfer Protocol)是文件传输协议的简称.用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Application).用户可以通过它把自己的PC机与世界各地所有运行FTP协议的服务器相连,访问服务器上的大量程序和信息.如果用户需要将文件从自己的计算机上发送到另一台计算机上,可使用FTP上传(upload)或(put)操作,而更多种的情况是用户使用FTP下载(download)或获取(get)操作从FTP服务器上下载文件 在传输文件时我们

  • Android实现文件上传和下载倒计时功能的圆形进度条

    screenshot 截图展示 import step1. Add it in your root build.gradle at the end of repositories: allprojects { repositories { ... maven { url 'https://jitpack.io' } } } step2. Add the dependency dependencies { compile 'com.github.yanjiabin:ExtendsRingPrigr

  • php使用ftp实现文件上传与下载功能

    本文实例为大家分享了php ftp文件上传与下载的具体代码,供大家参考,具体内容如下 ftp文件上传 php自带有ftp操作的函数包,一个比较简单实现的ftp文件上传操作可以通过以下几个步骤来完成: 1.确认ftp server的ip地址与port端口信息(如果使用的是默认端口则可以不关心): 2.进行ftp_connect操作,连接到ftp server(需要注意一下是否设置了port参数): 3.进行ftp_login操作,使用ftp用户名和密码进行登录: 4.这里开始区分,如果只需要把文件

  • ASP.NET Core文件上传与下载实例(多种上传方式)

    前言 前段时间项目上线,实在太忙,最近终于开始可以研究研究ASP.NET Core了. 打算写个系列,但是还没想好目录,今天先来一篇,后面在整理吧. ASP.NET Core 2.0 发展到现在,已经很成熟了.下个项目争取使用吧. 正文 1.使用模型绑定上传文件(官方例子) 官方机器翻译的地址:https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads 这里吐槽一下 - -,这TM的机器翻译..还不如自己看E文的..

  • Retrofit+Rxjava实现文件上传和下载功能

    Retrofit简介: 在Android API4.4之后,Google官方使用了square公司推出的okHttp替换了HttpClient的请求方式.后来square公司又推出了基于okHttp的网络请求框架:Retrofit. 什么是 RxJava? RxJava 是一个响应式编程框架,采用观察者设计模式.所以自然少不了 Observable 和 Subscriber 这两个东东了. RxJava 是一个开源项目,地址:https://github.com/ReactiveX/RxJava

  • nodejs multer实现文件上传与下载

    本文实例为大家分享了nodejs实现文件上传下载的具体代码,供大家参考,具体内容如下 1.介绍 做了一个关于文件上传和下载的demo ,选择了Multer 作为中间件进行数据处理. 关于multer请参考中文翻译文档 https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md 或者官方文档 2. upload 文件上传 html form标签内设置enctype="multipart/form-data"是必须

随机推荐