溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android使用ftp方式實(shí)現(xiàn)文件上傳和下載功能的方法

發(fā)布時(shí)間:2020-06-23 15:47:39 來(lái)源:億速云 閱讀:1616 作者:清晨 欄目:移動(dòng)開(kāi)發(fā)

不懂Android使用ftp方式實(shí)現(xiàn)文件上傳和下載功能的方法?其實(shí)想解決這個(gè)問(wèn)題也不難,下面讓小編帶著大家一起學(xué)習(xí)怎么去解決,希望大家閱讀完這篇文章后大所收獲。

近期在工作上一直再維護(hù)平臺(tái)OTA在線升級(jí)項(xiàng)目,其中關(guān)于這個(gè)升級(jí)文件主要是存放于ftp服務(wù)器上的,然后客戶端通過(guò)走ftp協(xié)議方式下載至本地Android機(jī)進(jìn)行一個(gè)系統(tǒng)升級(jí)操作。那么今天將對(duì)ftp實(shí)現(xiàn)文件上傳和下載進(jìn)行一個(gè)使用總結(jié),關(guān)于ftp這方面的理論知識(shí)如果不是太了解的各位道友,那么請(qǐng)移步HTTP和FTP的區(qū)別的一些理論知識(shí) 作個(gè)具體的了解或者查閱相關(guān)資料。那么先看看個(gè)人工作項(xiàng)目這個(gè)OTA升級(jí)效果圖吧。如下:

Android使用ftp方式實(shí)現(xiàn)文件上傳和下載功能的方法

下面是具體的接口實(shí)現(xiàn):

Android使用ftp方式實(shí)現(xiàn)文件上傳和下載功能的方法

那么相關(guān)ftp的操作,已經(jīng)被封裝到ota.ftp這個(gè)包下,各位童鞋可以下載示例代碼慢慢研究。另外這個(gè)要是用ftp服務(wù)我們cline端需要再項(xiàng)目工程導(dǎo)入ftp4j-1.7.2.jar包

這邊作個(gè)使用的邏輯分析:首先在我們的項(xiàng)目工程FtpApplication中啟動(dòng)這個(gè)OtaService,其中OtaService作為一個(gè)服務(wù)運(yùn)行起來(lái),在這個(gè)服務(wù)里面拿到封裝好ftp相關(guān)接口的DownLoad.java進(jìn)行ftp文件操作,關(guān)鍵代碼如下:

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

 /**
 * 創(chuàng)建FTP連接
 * 
 * @param host
 *  主機(jī)名或IP
 * @param port
 *  ftp端口
 * @param username
 *  ftp用戶名
 * @param password
 *  ftp密碼
 * @return 一個(gè)客戶端
 * @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下載文件到本地一個(gè)文件夾,如果本地文件夾不存在,則創(chuàng)建必要的目錄結(jié)構(gòu)
 * 
 * @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.formatPath5File(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的一個(gè)目錄下
 * 
 * @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.formatPath5FTP(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的一個(gè)目錄下
 * 
 * @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.formatPath5FTP(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.formatPath5FTP(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);
 }
 }
/**
 * 判斷一個(gè)FTP路徑是否存在,如果存在返回類型(FTPFile.TYPE_DIRECTORY=1、FTPFile.TYPE_FILE=0、
 * FTPFile.TYPE_LINK=2) 如果文件不存在,則返回一個(gè)-1
 * 
 * @param client
 *  FTP客戶端
 * @param remotePath
 *  FTP文件或文件夾路徑
 * @return 存在時(shí)候返回類型值(文件0,文件夾1,連接2),不存在則返回-1
 */
 public static int isExist(FTPClient client, String remotePath) {
 remotePath = PathToolkit.formatPath5FTP(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;
  // 假設(shè)推理判斷
  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.formatPath5FTP(remotePath);
 if(isExist(client, remotePath) == 0) {
  FTPFile[] files = client.list(remoteFormatPath);
  return files[0].getSize();

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

 /**
 * 關(guān)閉FTP連接,關(guān)閉時(shí)候像服務(wù)器發(fā)送一條關(guān)閉命令
 * 
 * @param client
 *  FTP客戶端
 * @return 關(guān)閉成功,或者鏈接已斷開(kāi),或者鏈接為null時(shí)候返回true,通過(guò)兩次關(guān)閉都失敗時(shí)候返回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;
 }
}

包括登錄,開(kāi)始下載,取消下載,獲取升級(jí)文件版本號(hào)和服務(wù)器版本校驗(yàn)等。其它的是一些數(shù)據(jù)庫(kù),SD卡文件相關(guān)操作,那么最后在我們下載完成之后需要對(duì)文件進(jìn)行一個(gè)文件解壓再執(zhí)行升級(jí)操作,這部分在ZipExtractor.java和OTAProvider.java中實(shí)現(xiàn)

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享Android使用ftp方式實(shí)現(xiàn)文件上傳和下載功能的方法內(nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問(wèn)題就找億速云,詳細(xì)的解決方法等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI