- 使用方法:
- FTPClient client = new FTPClient();
- client.connect("ftp.host.com", 8021);
- client.login("carlo", "mypassword");
- 沒有異常表示串連成功,否則會墊子拋出FTPException異常。
- 當然還有一些重載方法,如果連接埠為21就可以用client.connect(host);
-
- 為了處理匿名的登入,可以client.login("anonymous", "ftp4j");,使用者名稱是anonymous,密碼隨意。
-
- 登入之後需要對伺服器進行操作,如目錄顯示,進入等;
- String dir = client.currentDirectory(); 顯示目前的目錄
- 修改進入的目錄
- client.changeDirectory(newPath);
- 可以使用相對路徑,也可以使用絕對路徑,下面兩種都可以。
- client.changeDirectory("/an/absolute/one");
- client.changeDirectory("relative");
- 如果只想進入上一層:client.changeDirectoryUp();
-
- ftp4j中有兩個特別目錄“.","..",分別表示根目錄與上一層目錄。
-
- 重新命名:client.rename("oldname", "newname");
- 或移動檔案:client.rename("myfile.txt", "myfolder/myfile.txt");
- 刪除檔案:client.deleteFile(relativeOrAbsolutePath);可以使用相對或絕對路徑。
- 建立目錄:client.createDirectory("newfolder");
- 刪除目錄:client.deleteDirectory(absoluteOrRelativePath);
-
- 顯示檔案,目錄,連結
- 由於伺服器的不同,所以返回的檔案清單格式也不同,可能是UNIX,也可能是WIN的。ftp4j目錄支援:
- UNIX style and variants (i.e. MAC style)
- DOS style
- NetWare styles
- EPLF
- MLSD
-
- .顯示當前的目錄檔案:FTPFile[] list = client.list();
- FTPFile包含了所需要的資訊,從type可以知道是目錄還是檔案,或連結。
- 除此外還可以過濾:
- FTPFile[] list = client.list("*.jpg");過濾了,只顯示圖片
-
- 如果想知道修改上期,需要單獨擷取,不能從上面的list()方法得到:
- java.util.Date md = client.modifiedDate("filename.ext");
-
- 接下來就是上傳與下載了:
- client.download("remoteFile.ext", new java.io.File("localFile.ext"));
- client.upload(new java.io.File("localFile.ext"));
- 追加內容的上傳
- client.append(new java.io.File("localFile.ext"));
- 這些是阻塞方法,只有在完成後才返回,所以一個FTPClient只能在同時進行一個傳輸。如果你想多個檔案同時傳輸,可以使用多個FTPClient,FTPClient單獨串連伺服器。
-
- 當今的軟體不能只是功能上實現了,還需要注意使用者體驗,所以上傳下下載需要知道進度,ftp4j都通過FTPDataTransferListener這個介面來實現的,如果有一個方法:
- public void transferred(int length) {
- // Yet other length bytes has been transferred since the last time this
- 這個方法是說在距上一次傳輸到這一次傳輸的內容多少,
- 如果要有一個進度條,需要知道總量,然後當前傳輸的量,所以需要進行一些處理,如在開始上傳時,擷取本地檔案上傳大小,然後從這個介面中得到已經傳輸的檔案疊加起來得到已經傳輸檔案總量的大小,再計算得到進度。
-
- 從FTPClient中可以知道:在上傳時:listener.transferred(l);l表示這次傳輸的量,但這似乎不是我們想要的,
- 修改為:listener.transferred(done);這個done表示的是上傳的總量,是已經存在的,直接使用就好了。
- }
-
- 然後就可以通過重載方法加入這個監聽器client.download("remoteFile.ext", new java.io.File("localFile.ext"), new MyTransferListener());,其它略了。
-
- 對同一個FTPClient,多個線程間的操作是有影響的,如可以在其它線程中調用abortCurrentDataTransfer()來結當前的傳輸行為。
- 這個方法傳入 false表示突然停止,傳入true表示發送ABOR命令,是個合法的結束。然後會有FTPAbortedException異常。
-
- ftp4j還支援斷點:
- client.download("remoteFile.ext", new java.io.File("localFile.ext"), 1056);表示從1057開始,前面的不需要再傳輸了。
- 上傳也類似 。
-
- 主動與被動的傳輸:
- 主動的傳輸行為:
- 用戶端發送ip地址與連接埠號碼到伺服器
- 用戶端請求伺服器傳輸資料,開始監聽連接埠
- 伺服器串連地址與連接埠
- 資料轉送由一個新的通道開始傳輸。
- 主動的需要用戶端支援接收資訊如果用戶端有防火牆,代理等,會有些問題,
-
- 被動的傳輸行為:
- 用戶端請求伺服器準備被動的資料轉送。
- 伺服器回複並帶有ip與連接埠。
- 用戶端請求傳輸也串連。
- 資料轉送由一個新的通道開始傳輸。
-
- 通過以下方式改變:
- client.setPassive(false); // Active mode
- client.setPassive(true); // Passive mode
- 預設是被動的。
- 這些屬性可以通過系統屬性來設定 :
- 如ftp4j.activeDataTransfer.acceptTimeout設定逾時時間:
- java -Dftp4j.activeDataTransfer.hostAddress=178.12.34.167
- -Dftp4j.activeDataTransfer.portRange=6000-7000
- -Dftp4j.activeDataTransfer.acceptTimeout=5000 MyClass
-
- Set property values directly in the code. I.e.:
- System.setProperty("ftp4j.activeDataTransfer.hostAddress", "178.12.34.167");
- System.setProperty("ftp4j.activeDataTransfer.portRange", "6000-7000");
- System.setProperty("ftp4j.activeDataTransfer.acceptTimeout", "5000");
-
- 二進位與文本傳輸類型:
- 從源碼可以看出是以尾碼名來判斷檔案的類型,所以個人認為,上傳的檔案需要自己知道什麼類型的,不小心將二進位檔案改為txt尾碼,可能會有些問題。
- client.setType(FTPClient.TYPE_TEXTUAL);
- client.setType(FTPClient.TYPE_BINARY);
- client.setType(FTPClient.TYPE_AUTO);
- 當然它提供了一些自訂的類型client.setTextualExtensionRecognizer(myRecognizer);
-
- 一些伺服器支援資料壓縮傳輸,叫MODE Z。可以通過client.setCompressionEnabled(true);開啟,在這之前可以確認:boolean compressionEnabled = client.isCompressionEnabled();
-
- 網站規範與命令:
- FTPReply reply = client.sendSiteCommand("YOUR COMMAND");
- 也可以自訂命令
- FTPReply reply = client.sendCustomCommand("YOUR COMMAND");
- 都返回一個FTPReply對象。可以從這個對象得到一些傳回碼,資訊等內容。
-
- -----------------------------------------------
- 上面是ftp4j的文檔的一些知識。有了以上知識,開發一個android用戶端就相對容易多了。
- 如我想得到伺服器的檔案目錄操作(選擇檔案,選擇目錄,進入目錄)
- 就可以使用ListView+ListAdapter顯示目錄與檔案,然後由於 android的操作可以使用OnItemLongClickListener長按與短按OnItemClickListener分別指定一些操作,如短按可以選擇為進入目錄:
- public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
- FTPFile ftpFile=mFileList.get(i);
- String filename=ftpFile.getName();
- if ("..".equals(filename)) {
- Log.d(TAG, "change directory up.");
- changeDirectoryUp();
- } else if (".".equals(filename)) {
- Log.d(TAG, "change directory root");
- changeDirectory("/");
- } else {
- if (ftpFile.getType()==FTPFile.TYPE_DIRECTORY) {
- Log.d(TAG, "change directory:"+filename);
- changeDirectory(filename);
- }
- }
- }
-
- mFtpClient.changeDirectory(path);
- mFtpClient.changeDirectoryUp();就是上面最終調用的方法。
- 然後在長按中:
- FTPFile ftpFile=mFileList.get(i);
- String filename=ftpFile.getName();
- if ("..".equals(filename)||".".equals(filename)) {
- Log.d(TAG, "在這裡沒有處理");
- } else {
- if (ftpFile.getType()==FTPFile.TYPE_DIRECTORY) {
- Log.d(TAG, "change directory:"+filename);
- selectDirectory(filename);
- }
- }
- selectDirectory()方法就是作為選中目錄上傳目的地。然後可以將本地檔案傳入這個目錄。
- 在改變目錄後調用:
- private void refreshFiles(FTPClient mFtpClient) throws IOException, FTPIllegalReplyException, FTPException {
- FTPFile[] files=new FTPFile[0];
- try {
- files=mFtpClient.list();
- List<FTPFile> ftpFiles=(List<FTPFile>) Arrays.asList(files);
- mFileList.clear();
- mFileList.addAll(ftpFiles);
- Message message=Message.obtain(mHandler, REFRESH_FILE);
- message.obj=mFtpClient.currentDirectory();
- mHandler.sendMessage(message);
- //這裡就是重新整理ListView。
- } catch (FTPDataTransferException e) {
- e.printStackTrace();
- } catch (FTPAbortedException e) {
- e.printStackTrace();
- } catch (FTPListParseException e) {
- e.printStackTrace();
- }
- }
-
- 提供了上傳下載的功能後,就可以使用它了,建立一個簡單的ftp伺服器,HOMEftpserver就是個不錯的東西,然後拍照或錄影再上傳。其它就不說了,直接傳代碼上來。完成的程式可以使用,只是有些簡陋,僅供參考。目前的需求就是拍照來錄影後上傳到ftp。
ftpj4:http://www.sauronsoftware.it/projects/ftp4j/download.php:ftp4j 1.7.1 發布,Java 的 FTP 用戶端類庫
ftp4j 1.7.1 發布,該版本為 FTPConnector 新增 setUseSuggestedAddressForDataConnections() 方法用於決定是否信任伺服器的通過 PASV 命令返回的地址,修複了自動 noop 定時器的bug,調用 SimpleDateFormat 改為線程安裝模式,改進了資料轉送程式以相容更多的伺服器和Proxy 伺服器。
ftp4j是一個FTP用戶端Java類庫,實現了FTP用戶端應具有的大部分功能。可以將ftp4j嵌到你的Java應用中,來傳輸檔案(包括上傳和下 載),瀏覽遠程FTP伺服器上的目錄和檔案,建立、刪除、重命,移動遠程目錄和檔案。ftp4j提供多種方式串連到遠程FTP伺服器包括:通過 TCP/IP直接連接,通過FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理串連,通過SSL安全連線。
ftp4j 1.7 發布了,主要改進內容包括:
- 對 FTP 連接器架構的修改
- FTPConnector 不再是個介面,改成了抽象類別,實現了一些具有逾時檢測的串連
- 調用者可設定串連、讀取和關閉操作的逾時時間
- 提供中斷串連的方法,FTPClient.abortCurrentConnectionAttempt();
- 修複了 HTTPTunnelConnector 中的 bug
http://www.sauronsoftware.it/projects/ftp4j/download.php