近期接觸到一個需求,就是將文件從Android系統上傳到FTP服務器,雖然以前接觸過FTP服務器,瞭解基本的使用流程,可是將此流程從使用習慣轉化爲代碼實現仍是有必定難度的。可是基本的流程仍是比較清楚的:java
- 1.在Android手機上建立一個FTP客戶端
- 2.設置host及端口創建與FTP服務器的鏈接
- 3.使用用戶名和密碼登陸FTP服務器
- 4.更改目錄,將當前客戶端指向的服務端的文件夾從跟目錄調整到指定的目錄
- 5.上傳文件,並等待上傳完成的結果
- 6.斷開和FTP服務器的連接
public class FTPClientFunctions { private static final String TAG = "FTPClientFunctions"; private FTPClient ftpClient = null; // FTP客戶端 /** * 鏈接到FTP服務器 * * @param host ftp服務器域名 * @param username 訪問用戶名 * @param password 訪問密碼 * @param port 端口 * @return 是否鏈接成功 */ public boolean ftpConnect(String host, String username, String password, int port) { try { ftpClient = new FTPClient(); Log.d(TAG, "connecting to the ftp server " + host + " :" + port); ftpClient.connect(host, port); // 根據返回的狀態碼,判斷連接是否創建成功 if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { Log.d(TAG, "login to the ftp server"); boolean status = ftpClient.login(username, password); /* * 設置文件傳輸模式 * 避免一些可能會出現的問題,在這裏必需要設定文件的傳輸格式。 * 在這裏咱們使用BINARY_FILE_TYPE來傳輸文本、圖像和壓縮文件。 */ ftpClient.setFileType(FTP.BINARY_FILE_TYPE); ftpClient.enterLocalPassiveMode(); return status; } } catch (Exception e) { e.printStackTrace(); Log.d(TAG, "Error: could not connect to host " + host); } return false; } /** * 斷開ftp服務器鏈接 * * @return 斷開結果 */ public boolean ftpDisconnect() { // 判斷空指針 if (ftpClient == null) { return true; } // 斷開ftp服務器鏈接 try { ftpClient.logout(); ftpClient.disconnect(); return true; } catch (Exception e) { Log.d(TAG, "Error occurred while disconnecting from ftp server."); } return false; } /** * ftp 文件上傳 * * @param srcFilePath 源文件目錄 * @param desFileName 文件名稱 * @param desDirectory 目標文件 * @return 文件上傳結果 */ public boolean ftpUpload(String srcFilePath, String desFileName, String desDirectory) { boolean status = false; try { FileInputStream srcFileStream = new FileInputStream(srcFilePath); status = ftpClient.storeFile(desFileName, srcFileStream); srcFileStream.close(); return status; } catch (Exception e) { e.printStackTrace(); Log.d(TAG, "upload failed: " + e.getLocalizedMessage()); } return status; } /** * ftp 更改目錄 * * @param path 更改的路徑 * @return 更改是否成功 */ public boolean ftpChangeDir(String path) { boolean status = false; try { status = ftpClient.changeWorkingDirectory(path); } catch (Exception e) { e.printStackTrace(); Log.d(TAG, "change directory failed: " + e.getLocalizedMessage()); } return status; } }
// 網絡操做,但開一個線程進行處理 new Thread(new Runnable() { @Override public void run() { // TODO 能夠首先去判斷一下網絡 ftpClient = new FTPClientFunctions(); boolean connectResult = ftpClient.ftpConnect(FTP_SERVER, FTP_USERNAME, FTP_PASSWORD, FTP_PORT); if (connectResult) { boolean changeDirResult = ftpClient.ftpChangeDir("/**"); if (changeDirResult) { boolean uploadResult = ftpClient.ftpUpload(sourceFilePath, descFileName, ""); if (uploadResult) { Log.w(TAG, "上傳成功"); boolean disConnectResult = ftpClient.ftpDisconnect(); if(disConnectResult) { Log.e(TAG, "關閉ftp鏈接成功"); } else { Log.e(TAG, "關閉ftp鏈接失敗"); } } else { Log.w(TAG, "上傳失敗"); } } else { Log.w(TAG, "切換ftp目錄失敗"); } } else { Log.w(TAG, "鏈接ftp服務器失敗"); } } }).start();
commons-net-3.6.jar : Apache Commons Net 阿帕奇提供的經常使用的網絡交互的jar包。
支持如下協議:apache
- FTP/FTPS
- FTP over HTTP (experimental)
- NNTP
- SMTP(S)
- POP3(S)
- IMAP(S)
- Telnet
- TFTP
- Finger
- Whois
- rexec/rcmd/rlogin
- Time (rdate) and Daytime
- Echo
- Discard
- NTP/SNTP
在這裏咱們只用的了FTP協議。不得不說,庫使用起來仍是至關方便的。
相關連接:http://commons.apache.org/proper/commons-net/服務器