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

作者:一诺的秘密花园 时间:2021-06-02 18:15:55 

本文实例为大家分享了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();
 }

}
}

来源:http://blog.csdn.net/mr_jianrong/article/details/78049178

标签:Android,FTP,上传,下载
0
投稿

猜你喜欢

  • C# winfrom 模拟ftp文件管理实现代码

    2023-07-15 16:29:48
  • Android调用系统摄像头拍照并显示在ImageView上

    2022-02-19 17:42:00
  • C#调用WebService实例开发

    2022-11-21 22:51:08
  • Java实现红黑树(平衡二叉树)的详细过程

    2021-08-08 15:03:12
  • android绘制曲线和折线图的方法

    2021-11-19 02:26:02
  • Android之ListView分页加载数据功能实现代码

    2023-08-13 03:44:17
  • 基于C#技术实现身份证识别功能

    2023-10-01 14:16:26
  • C#实现控制Windows系统关机、重启和注销的方法

    2023-07-24 17:15:05
  • Netty分布式FastThreadLocal的set方法实现逻辑剖析

    2021-08-22 04:51:54
  • Unity3D网格功能生成球体网格模型

    2021-08-01 01:21:47
  • Springboot整合log4j2日志全解总结

    2021-12-27 22:56:58
  • java中的SpringBoot框架

    2022-02-10 16:50:05
  • C# 对PDF文档加密、解密(基于Spire.Cloud.SDK for .NET)

    2021-11-23 05:37:26
  • Android编程获取通知栏高度的方法

    2023-10-23 22:50:24
  • Android中RecyclerView实现分页滚动的方法详解

    2023-11-13 13:59:53
  • Java多态的全面系统解析

    2023-06-22 13:39:22
  • Android 中解决Viewpage调用notifyDataSetChanged()时界面无刷新的问题

    2022-11-11 22:21:50
  • java 线程创建多线程详解

    2021-08-06 22:02:22
  • 在Flutter中制作翻转卡片动画的完整实例代码

    2023-06-23 23:31:21
  • Spring Bean创建和循环依赖

    2023-10-21 09:17:51
  • asp之家 软件编程 m.aspxhome.com