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.OutputStream;
import java.io.RandomAccessFile;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import android.os.Environment; 

public class FTPManager {
 FTPClient ftpClient = null; 

 public FTPManager() {
  ftpClient = new FTPClient();
 } 

 // 连接到ftp服务器
 public synchronized boolean connect() throws Exception {
  boolean bool = false;
  if (ftpClient.isConnected()) {//判断是否已登陆
   ftpClient.disconnect();
  }
  ftpClient.setDataTimeout(20000);//设置连接超时时间
  ftpClient.setControlEncoding("utf-8");
  ftpClient.connect("ip地址", 端口);
  if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
   if (ftpClient.login("用户名", "密码")) {
    bool = true;
    System.out.println("ftp连接成功");
   }
  }
  return bool;
 } 

 // 创建文件夹
 public boolean createDirectory(String path) throws Exception {
  boolean bool = false;
  String directory = path.substring(0, path.lastIndexOf("/") + 1);
  int start = 0;
  int end = 0;
  if (directory.startsWith("/")) {
   start = 1;
  }
  end = directory.indexOf("/", start);
  while (true) {
   String subDirectory = directory.substring(start, end);
   if (!ftpClient.changeWorkingDirectory(subDirectory)) {
    ftpClient.makeDirectory(subDirectory);
    ftpClient.changeWorkingDirectory(subDirectory);
    bool = true;
   }
   start = end + 1;
   end = directory.indexOf("/", start);
   if (end == -1) {
    break;
   }
  }
  return bool;
 } 

 // 实现上传文件的功能
 public synchronized boolean uploadFile(String localPath, String serverPath)
   throws Exception {
  // 上传文件之前,先判断本地文件是否存在
  File localFile = new File(localPath);
  if (!localFile.exists()) {
   System.out.println("本地文件不存在");
   return false;
  }
  System.out.println("本地文件存在,名称为:" + localFile.getName());
  createDirectory(serverPath); // 如果文件夹不存在,创建文件夹
  System.out.println("服务器文件存放路径:" + serverPath + localFile.getName());
  String fileName = localFile.getName();
  // 如果本地文件存在,服务器文件也在,上传文件,这个方法中也包括了断点上传
  long localSize = localFile.length(); // 本地文件的长度
  FTPFile[] files = ftpClient.listFiles(fileName);
  long serverSize = 0;
  if (files.length == 0) {
   System.out.println("服务器文件不存在");
   serverSize = 0;
  } else {
   serverSize = files[0].getSize(); // 服务器文件的长度
  }
  if (localSize <= serverSize) {
   if (ftpClient.deleteFile(fileName)) {
    System.out.println("服务器文件存在,删除文件,开始重新上传");
    serverSize = 0;
   }
  }
  RandomAccessFile raf = new RandomAccessFile(localFile, "r");
  // 进度
  long step = localSize / 100;
  long process = 0;
  long currentSize = 0;
  // 好了,正式开始上传文件
  ftpClient.enterLocalPassiveMode();
  ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
  ftpClient.setRestartOffset(serverSize);
  raf.seek(serverSize);
  OutputStream output = ftpClient.appendFileStream(fileName);
  byte[] b = new byte[1024];
  int length = 0;
  while ((length = raf.read(b)) != -1) {
   output.write(b, 0, length);
   currentSize = currentSize + length;
   if (currentSize / step != process) {
    process = currentSize / step;
    if (process % 10 == 0) {
     System.out.println("上传进度:" + process);
    }
   }
  }
  output.flush();
  output.close();
  raf.close();
  if (ftpClient.completePendingCommand()) {
   System.out.println("文件上传成功");
   return true;
  } else {
   System.out.println("文件上传失败");
   return false;
  }
 } 

 // 实现下载文件功能,可实现断点下载
 public synchronized boolean downloadFile(String localPath, String serverPath)
   throws Exception {
  // 先判断服务器文件是否存在
  FTPFile[] files = ftpClient.listFiles(serverPath);
  if (files.length == 0) {
   System.out.println("服务器文件不存在");
   return false;
  }
  System.out.println("远程文件存在,名字为:" + files[0].getName());
  localPath = localPath + files[0].getName();
  // 接着判断下载的文件是否能断点下载
  long serverSize = files[0].getSize(); // 获取远程文件的长度
  File localFile = new File(localPath);
  long localSize = 0;
  if (localFile.exists()) {
   localSize = localFile.length(); // 如果本地文件存在,获取本地文件的长度
   if (localSize >= serverSize) {
    System.out.println("文件已经下载完了");
    File file = new File(localPath);
    file.delete();
    System.out.println("本地文件存在,删除成功,开始重新下载");
    return false;
   }
  }
  // 进度
  long step = serverSize / 100;
  long process = 0;
  long currentSize = 0;
  // 开始准备下载文件
  ftpClient.enterLocalActiveMode();
  ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
  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 % 10 == 0) {
     System.out.println("下载进度:" + process);
    }
   }
  }
  out.flush();
  out.close();
  input.close();
  // 此方法是来确保流处理完毕,如果没有此方法,可能会造成现程序死掉
  if (ftpClient.completePendingCommand()) {
   System.out.println("文件下载成功");
   return true;
  } else {
   System.out.println("文件下载失败");
   return false;
  }
 } 

 // 如果ftp上传打开,就关闭掉
 public void closeFTP() throws Exception {
  if (ftpClient.isConnected()) {
   ftpClient.disconnect();
  }
 }
}

具体实现看代码注释写的很详细。

一.Android中FTP文件上传代码:

// 上传例子
private void ftpUpload() {
 new Thread() {
 public void run() {
  try {
  System.out.println("正在连接ftp服务器....");
  FTPManager ftpManager = new FTPManager();
  if (ftpManager.connect()) {
  if (ftpManager.uploadFile(ftpManager.rootPath + "UpdateXZMarketPlatform.apk", "mnt/sdcard/")) {
  ftpManager.closeFTP();
  }
  }
  } catch (Exception e) {
  // TODO: handle exception
  // System.out.println(e.getMessage());
  }
 }
 }.start();
 }

二.Android中FTP文件下载代码:

// 下载例子
private void ftpDownload() {
 new Thread() {
 public void run() {
  try {
  System.out.println("正在连接ftp服务器....");
  FTPManager ftpManager = new FTPManager();
  if (ftpManager.connect()) {
  if (ftpManager.downloadFile(ftpManager.rootPath, "20120723_XFQ07_XZMarketPlatform.db")) {
  ftpManager.closeFTP();
  }
  }
  } catch (Exception e) {
  // TODO: handle exception
  // System.out.println(e.getMessage());
  }
 }
 }.start();
 }

自己之前做项目的时候写过的FTP上传代码:

package com.kandao.yunbell.videocall; 

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.SocketException; 

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply; 

import com.kandao.yunbell.common.SysApplication; 

import android.content.Context;
import android.util.Log; 

public class MyUploadThread extends Thread {
 private String fileName;// 文件名字
 private String filePath;// 文件本地路径
 private String fileStoragePath;// 文件服务器存储路径
 private String serverAddress;// 服务器地址
 private String ftpUserName;// ftp账号
 private String ftpPassword;// ftp密码
 private Context mContext;
 public MyUploadThread() {
  super();
  // TODO Auto-generated constructor stub
 } 

 public MyUploadThread(Context mContext,String fileName, String filePath,
    String fileStoragePath,String serverAddress,String ftpUserName,String ftpPassword) {
  super();
  this.fileName = fileName;
  this.filePath = filePath;
  this.fileStoragePath = fileStoragePath;
  this.serverAddress = serverAddress;
  this.ftpUserName = ftpUserName;
  this.ftpPassword = ftpPassword;
  this.mContext=mContext;
 } 

 @Override
 public void run() {
  super.run();
  try {
   FileInputStream fis=null;
   FTPClient ftpClient = new FTPClient();
   String[] idPort = serverAddress.split(":");
   ftpClient.connect(idPort[0], Integer.parseInt(idPort[1]));
   int returnCode = ftpClient.getReplyCode();
   Log.i("caohai", "returnCode,upload:"+returnCode);
   boolean loginResult = ftpClient.login(ftpUserName, ftpPassword);
   Log.i("caohai", "loginResult:"+loginResult);
   if (loginResult && FTPReply.isPositiveCompletion(returnCode)) {// 如果登录成功 

    // 设置上传目录 

    if (((SysApplication) mContext).getIsVideo()) {
     ((SysApplication) mContext).setIsVideo(false);
     boolean ff=ftpClient.changeWorkingDirectory(fileStoragePath + "/video/");
     Log.i("caohai", "ff:"+ff);
    }else{
    boolean ee=ftpClient.changeWorkingDirectory(fileStoragePath + "/photo/");
    Log.i("caohai", "ee:"+ee);
    }
    ftpClient.setBufferSize(1024);
    // ftpClient.setControlEncoding("iso-8859-1");
    // ftpClient.enterLocalPassiveMode();
    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
     fis = new FileInputStream(filePath + "/"
      + fileName);
     Log.i("caohai", "fileStoragePath00000:"+fileStoragePath);
    String[] path = fileStoragePath.split("visitorRecord"); 

    boolean fs = ftpClient.storeFile(new String((path[1]
      + "/photo/" + fileName).getBytes(), "iso-8859-1"), fis);
    Log.i("caohai", "shifoushangchuanchenggong:"+fs);
    fis.close();
    ftpClient.logout();
    //ftpClient.disconnect();
   } else {// 如果登录失败
    ftpClient.disconnect();
   }
  } catch (NumberFormatException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (SocketException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (UnsupportedEncodingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } 

 }
} 

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

时间: 2017-09-19

Android FTP 多线程断点续传下载\上传的实例

最近在给我的开源下载框架Aria增加FTP断点续传下载和上传功能,在此过程中,爬了FTP的不少坑,终于将功能实现了,在此把一些核心功能点记录下载. FTP下载原理 FTP单线程断点续传 FTP和传统的HTTP协议有所不同,由于FTP没有所谓的头文件,因此我们不能像HTTP那样通过设置header向服务器指定下载区间. 但是FTP协议提供了一个更好用的命令REST用于从指定位置恢复任务,同时FTP协议也提供了一个命令SIZE用于获取下载的文件大小,有了这两个命令,FTP断点续传也就没有什么问题.

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

shell脚本实现ftp上传下载文件功能

前段时间工作中需要将经过我司平台某些信息核验数据提取后上传到客户的FTP服务器上,以便于他们进行相关的信息比对核验.由于包含这些信息的主机只有4台,采取的策略是将生成的4个文件汇集到一个主机上,然后在这台主机上将文件上传的目标ftp服务器. 1,建立主机A到其他三台主机之间的信任关系,以便于远程拷贝文件 #生成主机A的本地认证秘钥,可以选择生成rsa或者dsa类型的秘钥,这里选取rsa [root@A ~]#ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa >/d

Java FTP上传下载删除功能实例代码

在没给大家上完整代码之前先给大家说下注意点: FTP上传下载,容易出现乱码,记得转换 package com.yinhai.team.action; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; impo

Java语言实现简单FTP软件 FTP上传下载管理模块实现(11)

本文为大家分享了FTP上传下载管理模块的实现方法,供大家参考,具体内容如下 1.上传本地文件或文件夹到远程FTP服务器端的功能. 当用户在本地文件列表中选择想要上传的文件后,点击上传按钮,将本机上指定的文件上传到FTP服务器当前展现的目录,下图为上传子模块流程图 选择好要上传的文件或文件夹,点击"上传"按钮,会触发com.oyp.ftp.panel.local.UploadAction类的actionPerformed(ActionEvent e)方法,其主要代码如下 /** * 上传

Java实现ftp上传下载、删除文件及在ftp服务器上传文件夹的方法

一个JAVA 实现FTP功能的代码,包括了服务器的设置模块,并包括有上传文件至FTP的通用方法.下载文件的通用方法以及删除文件.在ftp服务器上传文件夹.检测文件夹是否存在等,里面的有些代码对编写JAVA文件上传或许有参考价值,Java FTP主文件代码: package ftpDemo; import java.io.DataOutputStream; import java.io.InputStream; import java.io.OutputStream; import sun.net

Spring FTP上传下载工具类遇到问题小结

前言 最近在项目中需要和ftp服务器进行交互,在网上找了一下关于ftp上传下载的工具类,大致有两种. 第一种是单例模式的类. 第二种是另外定义一个Service,直接通过Service来实现ftp的上传下载. 这两种感觉都有利弊. 第一种实现了代码复用,但是配置信息全需要写在类中,维护比较复杂. 第二种如果是spring框架,可以通过propertis文件,动态的注入配置信息,但是又不能代码复用. 所以我打算自己实现一个工具类,来把上面的两种优点进行整合.顺便把一些上传过程中一些常见的问题也给解

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

本文实例讲述了python实现的简单FTP上传下载文件的方法.分享给大家供大家参考.具体如下: python本身自带一个FTP模块,可以实现上传下载的函数功能. #!/usr/bin/env python # -*- coding: utf-8 -*- from ftplib import FTP def ftp_up(filename = "20120904.rar"): ftp=FTP() ftp.set_debuglevel(2) #打开调试级别2,显示详细信息;0为关闭调试信息

Java语言实现简单FTP软件 FTP上传下载队列窗口实现(7)

本文为大家介绍了FTP上传下载队列窗口的实现方法,供大家参考,具体内容如下 1.首先看一下队列窗口的界面 2.看一下上传队列窗口的界面 3.看一下下载队列窗口的界面 package com.oyp.ftp.panel.queue; import static java.awt.BorderLayout.CENTER; import static java.awt.BorderLayout.EAST; import static javax.swing.ListSelectionModel.SIN

springboot 中文件上传下载实例代码

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者. Spring Boot特点 1. 创建独立的Spring应用程序 2. 嵌入的Tomcat,无需部署WAR文件 3. 简化Maven配置 4. 自动配置Spr

springboot操作阿里云OSS实现文件上传,下载,删除功能

参考资料:Java操作阿里云OSS操作官方文档 学会看文档,并实际运用也是一种习惯和技能 下面就来简单入门一下,用当下比较热门的Springboot 去操作阿里云OSS文件存储. 1.需求 (没踩过下面的坑的小伙伴可以直接跳过这一章节) 问题简述 首先,我在之前自己做一些开源小项目案例中遇到一些文件上传下载的问题,比如在本机文件上传和下载都可以正常使用,通过将文件上传到Springboot项目的根目录下,按日期分文件夹,文件访问也很方便,可以直接返回文件相对路径地址,并直接可以访问. 问题 然而