1. 程式人生 > >Android中關於FTP的檔案上傳和下載

Android中關於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檔案下載功能詳解

Android關於FTP檔案上傳和下載功能詳解  更新時間:2017年09月21日 11:41:14   作者:一諾的祕密花園    我要評論 這篇文章主要為大家詳細介紹了Android關於FTP檔案上傳和下載功能,具有一定的參考價值,感興趣

JavaWeb檔案下載

對於檔案上傳,瀏覽器在上傳的過程中是將檔案以流的形式提交到伺服器端的,如果直接使用Servlet獲取上傳檔案的輸入流然後再解析裡面的請求引數是比較麻煩,所以一般選擇採用apache的開源工具common-fileupload這個檔案上傳元件。這個common-fileupl

如何在基於Java的Web專案實現檔案下載

在Sevlet 3 以前,Servlet API中沒有支援上傳功能的API,因此要實現上傳功能需要引入第三方工具從POST請求中獲得上傳的附件或者通過自行處理輸入流來獲得上傳的檔案,我們推薦使用Apac

在SpringMVC框架實現檔案下載

首先在springmvc.xml中配置檔案上傳的屬性 <!-- 檔案上傳的屬性值 --> <bean id="multipartResolver" class="org.springframework.web.multi

Android關於FTP檔案下載

package ryancheng.example.progressbar; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; impo

如何在命令列使用 ftp 命令下載檔案

本文中,介紹在 Linux shell 中如何使用 ftp 命令。包括如何連線 FTP 伺服器,上傳或下載檔案以及建立資料夾。儘管現在有許多不錯的 FTP 桌面應用,但是在伺服器、SSH、遠端會話中命令列 ftp 命令還是有很多應用的。比如。需要伺服器從 ftp 倉庫拉取

Spring MVC檔案下載

檔案上傳 檔案上傳需將表格的提交方式設為"POST",並且將enctype設為"multipart/form-data",以二進位制的方式提交資料。 spring mvc中可通過MultipartResolver監聽每個請求,如有上傳的檔案,則把請求封裝為MultipartH

Java 實現ftp 檔案下載刪除

本文利用apache ftp工具實現檔案的上傳下載和刪除。具體如下: 1、下載相應的jar包      commons-net-1.4.1.jar 2、實現程式碼如下: public class FtpUtils { //ftp伺服器地址

java FtpClient 實現 FTP 檔案下載

package ftp; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileWrit

Android Retrofit2.0實現檔案下載

這篇主要介紹retrofit框架的上傳檔案到伺服器和從伺服器下載功能的實現 上傳檔案到伺服器 首先 retrofit2.0之前上傳檔案到伺服器需要一個叫TypedFile這個類,但是在2.0版本,這個類被取消了,因為2.0以後,retrofit內部集成了okhttp

表單檔案下載

檔案上傳和下載的實質:檔案拷貝 檔案上傳:從本地拷貝到伺服器磁碟上   客戶端需要編寫檔案上傳表單---->服務端需要編寫程式碼接受上傳的檔案 檔案下載:從伺服器磁碟上拷貝到本地磁碟   需要編寫服務端的程式碼,客戶端的下載的工作瀏覽器核心解決的

c#winform方式的檔案下載高效最新方法

網上很多檔案上傳下載的文章,多數是採用http方式,使用.net的webcliend的功能,此功能對大檔案效率比較低,對web伺服器安全性也有影響。 我採用資料庫的方式同樣實現並高效的處理了此功能,對於資料庫winform應用值得借鑑。 開發思路(以下思路是c/s三層架構,

javaExcel檔案下載

上傳在頁面必須加上下面屬性 <form method="post" enctype="multipart/form-data" target="frameFile" action="${vehiclePath }/bindVehicle?${_csrf.parameterName}=$

Spring 檔案下載控制

先建立根應用上下文配置,WebDemo/src/main/java/com/seliote/webdemo/config/RootContextConfig.java package com.seliote.webdemo.config; import org.springframework.c

xshell 檔案下載

xshell 檔案上傳和下載 介紹兩種方式:命令、工具 上傳和下載參照物件是本機 命令: 1.sz  檔案下載(檔案大小限制 4G) 2.rz 檔案上傳 工具: File Transfer(工具欄中有) 這個沒有上

Struts2的檔案下載(1)單檔案

在struts2中整合fileuoload功能,因為在匯入的jar包中包含了common-fileipload.jar檔案 在struts2中的interceptor 中有一個fileupload攔截器,他的主要功能就是完成檔案上傳。 注意事項 method=post

SpringMVC檔案下載

1. 檔案上傳 SpringMVC通過MultipartResolver來實現檔案上傳,預設沒有裝配,使用MultipartResolver需要加上commons-fileupload這個jar包。 1.1 配置MultipartResolver <!--配置上傳檔案控制元

**#使用springboot進行檔案下載**

使用springboot進行檔案上傳和下載 ##檔案下載功能的實現思路: 1.獲取要下載的檔案的絕對路徑 2.獲取要下載的檔名 3.設定content-disposition響應頭控制瀏覽器以下載的形式開啟檔案 4.獲取要下載的檔案輸入流 5.建立資料緩衝區//緩衝區解釋

asp.net 檔案下載管理原始碼

    利用asp.net進行檔案上傳和下載時非常常用的功能,現做整理,將原始碼上傳,提供給初學者參考,以下程式碼中的樣式檔案就不上傳了,下載者請將樣式去掉。 效果圖如下: <%@ Page Language="C#" AutoEventWireu

基於OkHttp網路通訊工具類(傳送get、post請求、檔案下載)

一、為什麼要用OkHttp? okhttp是專注於提升網路連線效率的http客戶端。 優點: 1、它能實現同一ip和埠的請求重用一個socket,這種方式能大大降低網路連線的時間,和每次請求都建立socket,再斷開socket的方式相比,降低了伺服器伺服器的壓力。 2、okhttp 對