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();
  } 

 }
} 

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

(0)

相关推荐

  • 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

  • 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

  • SpringBoot+微信小程序实现文件上传与下载功能详解

    目录 1.文件上传 1.1 后端部分 1.2 小程序前端部分 1.3 实现效果 2.文件下载 2.1 后端部分 2.2 小程序前端部分 2.3 实现效果 1.文件上传 1.1 后端部分 1.1.1 引入Apache Commons FIleUpload组件依赖 <!--文件上传与下载相关的依赖--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fil

  • JavaWeb实现文件上传与下载实例详解

    在Web应用程序开发中,文件上传与下载功能是非常常用的功能,下面通过本文给大家介绍JavaWeb实现文件上传与下载实例详解. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,common-fileupload是依赖于c

  • JavaScript进阶之前端文件上传和下载示例详解

    目录 文件下载 1.通过a标签点击直接下载 2.open或location.href 3.Blob和Base64 文件上传 文件上传思路 File文件 上传单个文件-客户端 上传文件-服务端 多文件上传-客户端 大文件上传-客户端 大文件上传-服务端 文件下载 1.通过a标签点击直接下载 <a href="https:xxx.xlsx" rel="external nofollow" download="test">下载文件</

  • python3 requests库文件上传与下载实现详解

    在接口测试学习过程中,遇到了利用requests库进行文件下载和上传的问题.同样,在真正的测试过程中,我们不可避免的会遇到上传和下载的测试. 文件上传: url = ztx.host+'upload/uploadFile?CSRFToken='+self.getCSRFToken()#上传文件的接口地址 header = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko', '

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

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

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

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

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

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

  • MyBatis与SpringMVC相结合实现文件上传、下载功能

    环境:maven+SpringMVC + Spring + MyBatis + MySql 本文主要说明如何使用input上传文件到服务器指定目录,或保存到数据库中:如何从数据库下载文件,和显示图像文件并实现缩放. 将文件存储在数据库中,一般是存文件的byte数组,对应的数据库数据类型为blob. 首先要创建数据库,此处使用MySql数据库. 注意:文中给出的代码多为节选重要片段,并不齐全. 1. 前期准备 使用maven创建一个springMVC+spring+mybatis+mysql的项目

  • spring mvc实现文件上传与下载功能

    本文实例为大家分享了spring mvc实现文件上传与下载功能的具体代码,供大家参考,具体内容如下 文件上传 在pom.xml中引入spring mvc以及commons-fileupload的相关jar <!-- spring mvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <v

随机推荐