Android中FTP上传、下载的功能实现(含进度)_Android

 Android中使用的FTP上传、下载,含有进度。

代码部分主要分为三个文件:MainActivity,FTP,ProgressInputStream

1. MainActivity

package com.ftp; 

import java.io.File;
import java.io.IOException;
import java.util.LinkedList; 

import com.ftp.FTP.DeleteFileProgressListener;
import com.ftp.FTP.DownLoadProgressListener;
import com.ftp.FTP.UploadProgressListener; 

import android.app.Activity;
import android.os.Bundle;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; 

public class MainActivity extends Activity { 

  private static final String TAG = "MainActivity"; 

  public static final String FTP_CONNECT_SUCCESSS = "ftp连接成功";
  public static final String FTP_CONNECT_FAIL = "ftp连接失败";
  public static final String FTP_DISCONNECT_SUCCESS = "ftp断开连接";
  public static final String FTP_FILE_NOTEXISTS = "ftp上文件不存在"; 

  public static final String FTP_UPLOAD_SUCCESS = "ftp文件上传成功";
  public static final String FTP_UPLOAD_FAIL = "ftp文件上传失败";
  public static final String FTP_UPLOAD_LOADING = "ftp文件正在上传"; 

  public static final String FTP_DOWN_LOADING = "ftp文件正在下载";
  public static final String FTP_DOWN_SUCCESS = "ftp文件下载成功";
  public static final String FTP_DOWN_FAIL = "ftp文件下载失败"; 

  public static final String FTP_DELETEFILE_SUCCESS = "ftp文件删除成功";
  public static final String FTP_DELETEFILE_FAIL = "ftp文件删除失败"; 

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

    initView();
  } 

  private void initView() { 

    //上传功能
    //new FTP().uploadMultiFile为多文件上传
    //new FTP().uploadSingleFile为单文件上传
    Button buttonUpload = (Button) findViewById(R.id.button_upload);
    buttonUpload.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) { 

          new Thread(new Runnable() {
            @Override
            public void run() { 

              // 上传
              File file = new File("/mnt/sdcard/ftpTest.docx");
              try { 

                //单文件上传
                new FTP().uploadSingleFile(file, "/fff",new UploadProgressListener(){ 

                  @Override
                  public void onUploadProgress(String currentStep,long uploadSize,File file) {
                    // TODO Auto-generated method stub
                    Log.d(TAG, currentStep);
                    if(currentStep.equals(MainActivity.FTP_UPLOAD_SUCCESS)){
                      Log.d(TAG, "-----shanchuan--successful");
                    } else if(currentStep.equals(MainActivity.FTP_UPLOAD_LOADING)){
                      long fize = file.length();
                      float num = (float)uploadSize / (float)fize;
                      int result = (int)(num * 100);
                      Log.d(TAG, "-----shangchuan---"+result + "%");
                    }
                  }
                });
              } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
              } 

            }
          }).start(); 

      }
    }); 

    //下载功能
    Button buttonDown = (Button)findViewById(R.id.button_down);
    buttonDown.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) { 

        new Thread(new Runnable() {
          @Override
          public void run() { 

            // 下载
            try { 

              //单文件下载
              new FTP().downloadSingleFile("/fff/ftpTest.docx","/mnt/sdcard/download/","ftpTest.docx",new DownLoadProgressListener(){ 

                @Override
                public void onDownLoadProgress(String currentStep, long downProcess, File file) {
                  Log.d(TAG, currentStep);
                  if(currentStep.equals(MainActivity.FTP_DOWN_SUCCESS)){
                    Log.d(TAG, "-----xiazai--successful");
                  } else if(currentStep.equals(MainActivity.FTP_DOWN_LOADING)){
                    Log.d(TAG, "-----xiazai---"+downProcess + "%");
                  }
                } 

              });              

            } catch (Exception e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
            } 

          }
        }).start(); 

      }
    }); 

    //删除功能
    Button buttonDelete = (Button)findViewById(R.id.button_delete);
    buttonDelete.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) { 

        new Thread(new Runnable() {
          @Override
          public void run() { 

            // 删除
            try { 

              new FTP().deleteSingleFile("/fff/ftpTest.docx",new DeleteFileProgressListener(){ 

                @Override
                public void onDeleteProgress(String currentStep) {
                  Log.d(TAG, currentStep);
                  if(currentStep.equals(MainActivity.FTP_DELETEFILE_SUCCESS)){
                    Log.d(TAG, "-----shanchu--success");
                  } else if(currentStep.equals(MainActivity.FTP_DELETEFILE_FAIL)){
                    Log.d(TAG, "-----shanchu--fail");
                  }
                } 

              });              

            } catch (Exception e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
            } 

          }
        }).start(); 

      }
    }); 

  }
}

2. FTP

package com.ftp; 

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.LinkedList;
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; 

public class FTP {
  /**
   * 服务器名.
   */
  private String hostName; 

  /**
   * 端口号
   */
  private int serverPort; 

  /**
   * 用户名.
   */
  private String userName; 

  /**
   * 密码.
   */
  private String password; 

  /**
   * FTP连接.
   */
  private FTPClient ftpClient; 

  public FTP() {
    this.hostName = "192.168.1.101";
    this.serverPort = 21;
    this.userName = "admin";
    this.password = "1234";
    this.ftpClient = new FTPClient();
  } 

  // -------------------------------------------------------文件上传方法------------------------------------------------ 

  /**
   * 上传单个文件.
   *
   * @param localFile
   *      本地文件
   * @param remotePath
   *      FTP目录
   * @param listener
   *      监听器
   * @throws IOException
   */
  public void uploadSingleFile(File singleFile, String remotePath,
      UploadProgressListener listener) throws IOException { 

    // 上传之前初始化
    this.uploadBeforeOperate(remotePath, listener); 

    boolean flag;
    flag = uploadingSingle(singleFile, listener);
    if (flag) {
      listener.onUploadProgress(MainActivity.FTP_UPLOAD_SUCCESS, 0,
          singleFile);
    } else {
      listener.onUploadProgress(MainActivity.FTP_UPLOAD_FAIL, 0,
          singleFile);
    } 

    // 上传完成之后关闭连接
    this.uploadAfterOperate(listener);
  } 

  /**
   * 上传多个文件.
   *
   * @param localFile
   *      本地文件
   * @param remotePath
   *      FTP目录
   * @param listener
   *      监听器
   * @throws IOException
   */
  public void uploadMultiFile(LinkedList<File> fileList, String remotePath,
      UploadProgressListener listener) throws IOException { 

    // 上传之前初始化
    this.uploadBeforeOperate(remotePath, listener); 

    boolean flag; 

    for (File singleFile : fileList) {
      flag = uploadingSingle(singleFile, listener);
      if (flag) {
        listener.onUploadProgress(MainActivity.FTP_UPLOAD_SUCCESS, 0,
            singleFile);
      } else {
        listener.onUploadProgress(MainActivity.FTP_UPLOAD_FAIL, 0,
            singleFile);
      }
    } 

    // 上传完成之后关闭连接
    this.uploadAfterOperate(listener);
  } 

  /**
   * 上传单个文件.
   *
   * @param localFile
   *      本地文件
   * @return true上传成功, false上传失败
   * @throws IOException
   */
  private boolean uploadingSingle(File localFile,
      UploadProgressListener listener) throws IOException {
    boolean flag = true;
    // 不带进度的方式
    // // 创建输入流
    // InputStream inputStream = new FileInputStream(localFile);
    // // 上传单个文件
    // flag = ftpClient.storeFile(localFile.getName(), inputStream);
    // // 关闭文件流
    // inputStream.close(); 

    // 带有进度的方式
    BufferedInputStream buffIn = new BufferedInputStream(
        new FileInputStream(localFile));
    ProgressInputStream progressInput = new ProgressInputStream(buffIn,
        listener, localFile);
    flag = ftpClient.storeFile(localFile.getName(), progressInput);
    buffIn.close(); 

    return flag;
  } 

  /**
   * 上传文件之前初始化相关参数
   *
   * @param remotePath
   *      FTP目录
   * @param listener
   *      监听器
   * @throws IOException
   */
  private void uploadBeforeOperate(String remotePath,
      UploadProgressListener listener) throws IOException { 

    // 打开FTP服务
    try {
      this.openConnect();
      listener.onUploadProgress(MainActivity.FTP_CONNECT_SUCCESSS, 0,
          null);
    } catch (IOException e1) {
      e1.printStackTrace();
      listener.onUploadProgress(MainActivity.FTP_CONNECT_FAIL, 0, null);
      return;
    } 

    // 设置模式
    ftpClient.setFileTransferMode(org.apache.commons.net.ftp.FTP.STREAM_TRANSFER_MODE);
    // FTP下创建文件夹
    ftpClient.makeDirectory(remotePath);
    // 改变FTP目录
    ftpClient.changeWorkingDirectory(remotePath);
    // 上传单个文件 

  } 

  /**
   * 上传完成之后关闭连接
   *
   * @param listener
   * @throws IOException
   */
  private void uploadAfterOperate(UploadProgressListener listener)
      throws IOException {
    this.closeConnect();
    listener.onUploadProgress(MainActivity.FTP_DISCONNECT_SUCCESS, 0, null);
  } 

  // -------------------------------------------------------文件下载方法------------------------------------------------ 

  /**
   * 下载单个文件,可实现断点下载.
   *
   * @param serverPath
   *      Ftp目录及文件路径
   * @param localPath
   *      本地目录
   * @param fileName
   *      下载之后的文件名称
   * @param listener
   *      监听器
   * @throws IOException
   */
  public void downloadSingleFile(String serverPath, String localPath, String fileName, DownLoadProgressListener listener)
      throws Exception { 

    // 打开FTP服务
    try {
      this.openConnect();
      listener.onDownLoadProgress(MainActivity.FTP_CONNECT_SUCCESSS, 0, null);
    } catch (IOException e1) {
      e1.printStackTrace();
      listener.onDownLoadProgress(MainActivity.FTP_CONNECT_FAIL, 0, null);
      return;
    } 

    // 先判断服务器文件是否存在
    FTPFile[] files = ftpClient.listFiles(serverPath);
    if (files.length == 0) {
      listener.onDownLoadProgress(MainActivity.FTP_FILE_NOTEXISTS, 0, null);
      return;
    } 

    //创建本地文件夹
    File mkFile = new File(localPath);
    if (!mkFile.exists()) {
      mkFile.mkdirs();
    } 

    localPath = localPath + fileName;
    // 接着判断下载的文件是否能断点下载
    long serverSize = files[0].getSize(); // 获取远程文件的长度
    File localFile = new File(localPath);
    long localSize = 0;
    if (localFile.exists()) {
      localSize = localFile.length(); // 如果本地文件存在,获取本地文件的长度
      if (localSize >= serverSize) {
        File file = new File(localPath);
        file.delete();
      }
    } 

    // 进度
    long step = serverSize / 100;
    long process = 0;
    long currentSize = 0;
    // 开始准备下载文件
    OutputStream out = new FileOutputStream(localFile, true);
    ftpClient.setRestartOffset(localSize);
    InputStream input = ftpClient.retrieveFileStream(serverPath);
    byte[] b = new byte[1024];
    int length = 0;
    while ((length = input.read(b)) != -1) {
      out.write(b, 0, length);
      currentSize = currentSize + length;
      if (currentSize / step != process) {
        process = currentSize / step;
        if (process % 5 == 0) { //每隔%5的进度返回一次
          listener.onDownLoadProgress(MainActivity.FTP_DOWN_LOADING, process, null);
        }
      }
    }
    out.flush();
    out.close();
    input.close(); 

    // 此方法是来确保流处理完毕,如果没有此方法,可能会造成现程序死掉
    if (ftpClient.completePendingCommand()) {
      listener.onDownLoadProgress(MainActivity.FTP_DOWN_SUCCESS, 0, new File(localPath));
    } else {
      listener.onDownLoadProgress(MainActivity.FTP_DOWN_FAIL, 0, null);
    } 

    // 下载完成之后关闭连接
    this.closeConnect();
    listener.onDownLoadProgress(MainActivity.FTP_DISCONNECT_SUCCESS, 0, null); 

    return;
  } 

  // -------------------------------------------------------文件删除方法------------------------------------------------ 

  /**
   * 删除Ftp下的文件.
   *
   * @param serverPath
   *      Ftp目录及文件路径
   * @param listener
   *      监听器
   * @throws IOException
   */
  public void deleteSingleFile(String serverPath, DeleteFileProgressListener listener)
      throws Exception { 

    // 打开FTP服务
    try {
      this.openConnect();
      listener.onDeleteProgress(MainActivity.FTP_CONNECT_SUCCESSS);
    } catch (IOException e1) {
      e1.printStackTrace();
      listener.onDeleteProgress(MainActivity.FTP_CONNECT_FAIL);
      return;
    } 

    // 先判断服务器文件是否存在
    FTPFile[] files = ftpClient.listFiles(serverPath);
    if (files.length == 0) {
      listener.onDeleteProgress(MainActivity.FTP_FILE_NOTEXISTS);
      return;
    } 

    //进行删除操作
    boolean flag = true;
    flag = ftpClient.deleteFile(serverPath);
    if (flag) {
      listener.onDeleteProgress(MainActivity.FTP_DELETEFILE_SUCCESS);
    } else {
      listener.onDeleteProgress(MainActivity.FTP_DELETEFILE_FAIL);
    } 

    // 删除完成之后关闭连接
    this.closeConnect();
    listener.onDeleteProgress(MainActivity.FTP_DISCONNECT_SUCCESS); 

    return;
  } 

  // -------------------------------------------------------打开关闭连接------------------------------------------------ 

  /**
   * 打开FTP服务.
   *
   * @throws IOException
   */
  public void openConnect() throws IOException {
    // 中文转码
    ftpClient.setControlEncoding("UTF-8");
    int reply; // 服务器响应值
    // 连接至服务器
    ftpClient.connect(hostName, serverPort);
    // 获取响应值
    reply = ftpClient.getReplyCode();
    if (!FTPReply.isPositiveCompletion(reply)) {
      // 断开连接
      ftpClient.disconnect();
      throw new IOException("connect fail: " + reply);
    }
    // 登录到服务器
    ftpClient.login(userName, password);
    // 获取响应值
    reply = ftpClient.getReplyCode();
    if (!FTPReply.isPositiveCompletion(reply)) {
      // 断开连接
      ftpClient.disconnect();
      throw new IOException("connect fail: " + reply);
    } else {
      // 获取登录信息
      FTPClientConfig config = new FTPClientConfig(ftpClient
          .getSystemType().split(" ")[0]);
      config.setServerLanguageCode("zh");
      ftpClient.configure(config);
      // 使用被动模式设为默认
      ftpClient.enterLocalPassiveMode();
      // 二进制文件支持
      ftpClient
          .setFileType(org.apache.commons.net.ftp.FTP.BINARY_FILE_TYPE);
    }
  } 

  /**
   * 关闭FTP服务.
   *
   * @throws IOException
   */
  public void closeConnect() throws IOException {
    if (ftpClient != null) {
      // 退出FTP
      ftpClient.logout();
      // 断开连接
      ftpClient.disconnect();
    }
  } 

  // ---------------------------------------------------上传、下载、删除监听--------------------------------------------- 

  /*
   * 上传进度监听
   */
  public interface UploadProgressListener {
    public void onUploadProgress(String currentStep, long uploadSize, File file);
  } 

  /*
   * 下载进度监听
   */
  public interface DownLoadProgressListener {
    public void onDownLoadProgress(String currentStep, long downProcess, File file);
  } 

  /*
   * 文件删除监听
   */
  public interface DeleteFileProgressListener {
    public void onDeleteProgress(String currentStep);
  } 

}

3. ProgressInputStream

package com.ftp; 

import java.io.File;
import java.io.IOException;
import java.io.InputStream; 

import com.ftp.FTP.UploadProgressListener; 

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log; 

public class ProgressInputStream extends InputStream { 

  private static final int TEN_KILOBYTES = 1024 * 10; //每上传10K返回一次 

  private InputStream inputStream; 

  private long progress;
  private long lastUpdate; 

  private boolean closed; 

  private UploadProgressListener listener;
  private File localFile; 

  public ProgressInputStream(InputStream inputStream,UploadProgressListener listener,File localFile) {
    this.inputStream = inputStream;
    this.progress = 0;
    this.lastUpdate = 0;
    this.listener = listener;
    this.localFile = localFile; 

    this.closed = false;
  } 

  @Override
  public int read() throws IOException {
    int count = inputStream.read();
    return incrementCounterAndUpdateDisplay(count);
  } 

  @Override
  public int read(byte[] b, int off, int len) throws IOException {
    int count = inputStream.read(b, off, len);
    return incrementCounterAndUpdateDisplay(count);
  } 

  @Override
  public void close() throws IOException {
    super.close();
    if (closed)
      throw new IOException("already closed");
    closed = true;
  } 

  private int incrementCounterAndUpdateDisplay(int count) {
    if (count > 0)
      progress += count;
    lastUpdate = maybeUpdateDisplay(progress, lastUpdate);
    return count;
  } 

  private long maybeUpdateDisplay(long progress, long lastUpdate) {
    if (progress - lastUpdate > TEN_KILOBYTES) {
      lastUpdate = progress;
      this.listener.onUploadProgress(MainActivity.FTP_UPLOAD_LOADING, progress, this.localFile);
    }
    return lastUpdate;
  } 

} 

原文链接:http://blog.csdn.net/tianyitianyi1/article/details/38637999

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, android上传进度条
, ftp上传进度条
实现ftp下载
ftp上传进度条、java ftp上传进度条、vb ftp上传文件进度条、ftp上传进度、安卓ftp上传进度,以便于您获取更多的相关知识。

时间: 2024-09-26 22:21:54

Android中FTP上传、下载的功能实现(含进度)_Android的相关文章

Android中FTP上传、下载的功能实现(含进度)

Android中使用的FTP上传.下载,含有进度. 代码部分主要分为三个文件:MainActivity,FTP,ProgressInputStream 1. MainActivity package com.ftp; import java.io.File; import java.io.IOException; import java.util.LinkedList; import com.ftp.FTP.DeleteFileProgressListener; import com.ftp.F

CuteFTP多线程FTP上传下载工具功能

  cuteftp能够将一个FTP站点上的文件直接传送到另一个FTP站点上,这就是所谓的FXP传输方式.如果你要将其它FTP站点上的"好东东"搬到自己网站上,运用此功能就太方便啦.让我们来看看如何操作: 1.使用"站点管理器"或"快速连接"登录到一个FTP站点. 2.再次启动CuteFTP,这样桌面上就同时打开了两个CuteFTP窗口. 3.在第二次启动的CuteFTP中,登录另一个FTP站点(或你的网站). 4.从一个CuteFTP窗口的远程文

applet实现大文件FTP上传下载的功能

问题描述 packageyp;importjava.applet.Applet;importjava.io.File;importjavax.swing.JButton;importjavax.swing.JFileChooser;importjavax.swing.filechooser.FileFilter;/***说明:本APPLET只是测试大文件FTP上传可行性*至于其他功能比如FTP下载.删除.FTP服务器文件列表可调用ContinueFTP相应功能.*/publicclassFile

ftp-关于C# 实现FTP上传下载的问题

问题描述 关于C# 实现FTP上传下载的问题 我用C# 从ftp服务器下载一个文件,当下载中断,比如突然断网了,客户端这边要怎么捕捉到异常来关闭下载流呢 解决方案 C#实现FTP上传下载C#实现FTP上传下载功能C#中FTP上传下载 解决方案二: try吧,发生错误,就关掉 解决方案三: 直接try catch,下载断开会触发异常的. 解决方案四: 双线程,一个线程A检测网络连接,另一个线程B负责下载,当线程B检测到断网就给线程A触发事件,A检测到事件发生则做善后处理

python实现的简单FTP上传下载文件实例

  本文实例讲述了python实现的简单FTP上传下载文件的方法.分享给大家供大家参考.具体如下: python本身自带一个FTP模块,可以实现上传下载的函数功能. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 #!/usr/bin/env python # -*- coding: utf-8

ftp上传下载,ftp服务器在windows系统下,web服务器在linux系统下

问题描述 ftp上传下载,ftp服务器在windows系统下,web服务器在linux系统下 哪位大神知道: ftp服务器在搭建windows系统下,web服务器在部署linux系统下,现java中使用ftpclient实现上传下载时,下载的文件内容是乱码: 之前web服务器也部署在windows系统下正常的,后来迁移到linux系统下出现乱码了啊,中文文件名编码正常. 查ftpclient的源码发现读取ftp服务器上文件的编码格式固定了,无法在外部修改,有试着将读取出来的文件转码各种编码方式,

使用Sun的FtpClient做FTP上传下载

001.//使用Sun的FtpClient做FTP上传下载 002.import sun.net.*; 003.import sun.net.ftp.*; 004.import java.io.*; 005.import java.util.*; 006./** 007.FTP远程命令列表<br> 008.USER    PORT    RETR    ALLO    DELE    SITE    XMKD    CDUP    FEAT<br> 009.PASS    PASV

如何利用程序自动执行ftp上传下载操作?

问题描述 如何利用程序自动执行ftp上传下载操作? 最近工作中反复要用ftp工具,对某些固定的文件做下载,修改,再上传的操作,觉得很麻烦.想 编一个程序,可以自动执行ftp链接,对于某个设置好的路径和文件进行上传下载,想请教大家实现的方法,比如可以调用哪些API之类的?非常感谢 解决方案 可以使用perl,python等语言完成. python可以使用ftplib. import ftplib session = ftplib.FTP('xxx.xxx.xxx.xxx','username','

vb60-vb 怎么用winsoc控件 ftp上传下载文件

问题描述 vb 怎么用winsoc控件 ftp上传下载文件 急求 vb 怎么用winsock控件 ftp上传下载文件,还有没有其他的做法,简单就好 解决方案 inet 比较简单,winsock有固定API调用,网上很多 InetFTP.UserName = txtusername.Text InetFTP.Password = txtpassword.Text InetFTP.Execute host_name, "Get logxxxx" Do While InetFTP.Still