用Java實現FTP批量大文件上傳下載(一)
本文介紹了在Java中,如何使用Java現有的可用的庫來編寫FTP客戶端代碼,并開發成Applet控件,做成基于Web的批量、大文件的上傳下載控件。文章在比較了一系列FTP客戶庫的基礎上,就其中一個比較通用且功能較強的j-ftp類庫,對一些比較常見的功能如進度條、斷點續傳、內外網的映射、在Applet中回調JavaScript函數等問題進行詳細的闡述及代碼實現,希望通過此文起到一個拋磚引玉的作用。
一、 引子
筆者在實施一個項目過程中出現了一種基于Web的文件上傳下載需求。在全省(或全國)各地的用戶,需要將一些文件上傳至某中心的文件服務器上。這些文件是用于一些大型的工程建設,可能涉及到上千萬甚至上億的建設工程。文件具有三個鮮明的特征:一是文件大,可能達到
首先考慮到是基于HTTP的傳輸方式。但筆者通過比較很快發現滿足上面的需求:
1:用HTTP協議上傳,似乎更適合web編程的方便性;上傳小于
2:用FTP協議上傳文件大于
筆者曾經使用VB也寫過ActiveX控件來進行批量文件的上傳下載,其功能也很強大。只是由于沒有對CAB文件或OCX進行專門的數字簽名,因此需要進行客戶端煩瑣的設置,如設置安全站點、降低客戶端的安全級別等等,因而放棄了些方案。
同時考慮到在需在客戶端對文件進行數字簽名及數據加密,決定采用Applet的方式實現。。文件上傳之前,在客戶端可以獲取本地USBKEY密鑰信息,完成對上傳文件的加密和簽名處理。雖然采用Applet要求在客戶端安裝JRE運行時環境,給客戶端的管理及使用帶來一度的不方便性,但是相對起如此大量的文件及文件的安全性,這也許已經算是比較小的代價了。
總結一下運行的環境為:
FTP服務器端:Serv-U,專業的FTP服務器端程序,網上有現成的軟件下載,當然讀者也可能自己寫一個服務器端的FTP文件接收程序來進行解釋。如果沒有特殊要求或功能的話,Serv-U應該可以滿足我們一般上傳下載的需求了;
客戶端:Java applet,當年讓Java大火了一把的號稱與微軟的ActiveX相提并論的技術當然,現在Java出了JavaFX,是不是Applet的替代品呢?
應用環境:Internet網,最終目的。
二、 Java FTP客戶端庫的選擇
讓我們設想這樣一個情形--我們想寫一個純Java的從一個遠程計算機上運行的FTP服務器上傳下載文件的應用程序;我們還希望能夠得到那些供下載的遠程文件的基本文件信息,如文件名、數據或者文件大小等。
盡管從頭開始寫一個FTP協議處理程序是可能的,并且也許很有趣,但這項工作也是困難、漫長并且存在著潛在的危險。因為我們不愿意親自花時間、精力、或者金錢去寫這樣的一個處理程序,所以我們轉而采用那些已經存在的可重用的組件。并且很多的庫存在于網上。
找一個優秀的適合我們需要的Java FTP 客戶端庫并不像看起來那么簡單。相反這是一項非常痛苦復雜的工作。首先找到一個FTP客戶端庫需要一些時間,其次,在我們找到所有的存在的庫后,我們該選哪一個呢?每個庫都適合不同的需求。這些庫在性能上是不等價的,并且它們的設計上有著根本上的差別。每個類庫都各具特點并使用不同的術語來描述它們。因而,評價和比較FTP客戶端庫是一件困難的事情。
使用可重用組件是一種值得提倡的方法,但是在這種情況下,剛開始往往是令人氣餒的。后來或許有點慚愧:在選擇了一個好的FTP庫后,其后的工作就非常簡單了,按簡單的規則來就行了。目前,已經有很多公開免費的ftp客戶端類庫,如simpleftp、J-ftp等,還有很多其他的ftpclient。如下表所示,表中未能全部列出,如讀者有更好的客戶端FTP類庫,請進行進一步的補充。
FTP客戶端類庫名 |
備注 |
J-ftp |
J-ftp |
simpleftp |
|
ftpclient |
com.enterprisedt.net.ftp.FTPClient |
FTPProtocol |
com.ibm.network.ftp.protocol.FTPProtocol |
FtpConnection |
net.sf.jftp.net.FtpConnection |
FTPClient |
org.apache.commons.net.ftp.FTPClient |
FTPClient |
jshop.jnet.FTPClient |
FtpClient |
sun.net.ftp.FtpClient |
FTP |
com.cqs.ftp.FTP |
Ftp |
cz.dhl.ftp.Ftp |
FTPClient |
org.globus.io.ftp.FTPClient |
在本文中,筆者采用是J-ftp。這個是個開源的且功能十分強大的客戶端FTP類庫。筆者很喜歡,同時也向各位讀者推薦一下。算了免費為它做一個廣告。
三、 基本功能
1、 登陸
采用FTP進行文件傳輸,其實本質上還是采用Java.net.socket進行通信。以下代碼只是類net.sf.jftp.net.FtpConnection其中一個login方法。當然在下面的代碼,為了節省版面,以及將一些原理闡述清楚,筆者將一些沒必要的代碼去掉了,如日志等代碼。完整的代碼請參考J-ftp的源代碼或是筆者所以的示例源代碼,后面的代碼示例也同理:


















































































































































此run方法中的socket這里說明一下,此類實現客戶端套接字(也可以就叫“套接字”),套接字是兩臺機器之間的通信端點。套接字的實際工作由 SocketImpl 類的實例執行。應用程序通過更改創建套接字實現的套接字工廠可以配置它自身,以創建適合本地防火墻的套接字。具體的說明請參考JDK5 的API說明,最好是中文的。呵呵。
未完待續,下篇寫上傳下載及進度條.....