1. FTP該如何實現斷點續傳
客戶端的實現步驟如下:
一、下載:
1、向伺服器發送「REST + 本地文件長度」命令,告訴伺服器,客戶端要斷點下載了。這時伺服器還不知道客戶端要下載哪個文件;
要實現FTP的斷點續傳,FTP伺服器必須支持REST指令,這條指令在FTP協議文本RFC959中就已經定義了,不過它不是FTP伺服器必須支持的指令。一般,你可以在下載前使用REST 100命令進行實驗,如果伺服器正常執行了這條命令,說明該伺服器支持FTP斷點續傳。REST後面跟的數表示下載文件的起始位置,而REST 0表示從文件最開始處下載。REST命令本身並不執行下載功能,你仍需要使用RETR命令執行下載工作。
2、向伺服器發送「RETR + 文件名」命令,通知伺服器要下載的文件名,這時伺服器開始定位文件指針讀文件並發送數據。
3、客戶端定位本地文件指針(文件末尾);
4、兩端的准備工作都做完了以後,客戶端創建socket,以被動或非被動方式建立數據通道,循環調用recv接收數據並追加入本地文件;
二、上傳:
1、獲取伺服器上和本地要上傳文件的同名文件大小;
2、向伺服器發送「APPE + 文件名」,通知伺服器,接下來從數據通道發送給你的數據要附加到這個文件末尾。
3、定位本地文件指針(和FTP上文件大小相同的位置)
4、從文件指針處讀數據並發送。
代碼里將斷點上傳和斷點下載放到同一個函數(MoveFile)里,通過get參數說明是上傳還是下載。
2. FTP數據傳輸問題
下載地址:
http://download.enet.com.cn/html/020162000120701.html
希望能幫到你
Serv-U 是目前眾多的FTP 伺服器軟體之一。通過使用Serv-U,用戶能夠將任何一台PC 設置成一個FTP 伺服器,這樣,用戶或其他使用者就能夠使用FTP 協議,通過在同一網路上的任何一台PC與FTP 伺服器連接,進行文件或目錄的復制,移動,創建,和刪除等。這里提到的FTP 協議是專門被用來規定計算機之間進行文件傳輸的標准和規則,正是因為有了象FTP 這樣的專門協議,才使得人們能夠通過不同類型的計算機,使用不同類型的操作系統,對不同類型的文件進行相互傳遞。
雖然目前FTP 伺服器端的軟體種類繁多,相互之間各有優勢,但是Serv-U 憑借其獨特的功能得以展露頭腳。具體來說,Serv-U 能夠提供以下功能:
符合windows 標準的用戶界面友好親切,易於掌握。
支持實時的多用戶連接,支持匿名用戶的訪問;通過限制同一時間最大的用戶訪問人數確保PC 的正常運轉。
安全性能出眾。在目錄和文件層次都可以設置安全防範措施。能夠為不同用戶提供不同設置,支持分組管理數量眾多的用戶。可以基於IP 對用戶授予或拒絕訪問許可權。
支持文件上傳和下載過程中的斷點續傳。
支持擁有多個IP 地址的多宿主站點。
能夠設置上傳和下載的比率,硬碟空間配額,網路使用帶寬等,從而能夠保證用戶有限的資源不被大量的FTP 訪問用戶所消耗。
可作為系統服務後台運行。
可自用設置在用戶登錄或退出時的顯示信息,支持具有UNIX 風格的外部鏈接。
上面列出的只是Serv-U 眾多功能中的一部分,具體的使用將在下文中進行詳細的介紹,這里要說明的? 時,Serv-U 在保持功能全面,強大的基礎上,提供的完全易於使用的操作界面,可以說一切盡在掌握。
使用說明
用戶在使用Serv-U 的過程中可能會碰到的所有設置問題都可以通過Serv-U 窗口中的菜單選項實現。如果用戶在安裝Serv-U 之後,啟動Serv-U 時,屏幕上沒有顯示出Serv-U 的控制窗口的話,可以用滑鼠右鍵點擊位於任務條系統托盤中的Serv-U 圖標(一個大寫的字母「U」),然後選擇彈出菜單中的第一項「Show Window」,這樣屏幕上就會顯示出Serv-U 的控制窗口。
設置FTP伺服器
位於Serv-U 控制窗口中的「SETUP」菜單中的第一項「FTP-SERVER」用來對FTP 伺服器進行總體上的設置。在選擇之後出現的窗口中的第一項「FTP PORT NUMBER」用來設置FTP伺服器使用的埠號,FTP伺服器將會通過該埠收聽所有來訪用戶的信息。一般情況下,FTP 伺服器的默認埠號為21,但是用戶可以根據自己的情況自由的進行更改,只要能夠保證所採用的埠號與其它網路應用不沖突即可。這里需要說明的一點是,使用用戶自己選擇的伺服器埠可以起到很好的安全防範作用,這時,只有用戶自己和其他知道該埠號的用戶才能夠成功的實現與伺服器的連接。因此,建議用戶在設置F TP 伺服器的時候使用自己選定的埠,而不要只是簡單的使用默認值。
隨後用戶需要設置伺服器所能提供的最大速度。一般情況下,用戶可以將這項空出,那麼伺服器將會利用所有可能的帶寬為客戶提供服務。能夠為用戶提供最大的訪問速度當然很好,但是過多的F TP 用戶可能會蠶食掉一切可能的帶寬,從而使其它的網路應用幾乎不可能實現。因此,合理的控制FTP 伺服器所能夠佔用的最大帶寬還是很重要的。
下一項是設置伺服器允許的最大用戶訪問量。在此,用戶可以限制同一時間內訪問FTP 伺服器的最大人數。如果把該項設為0,那麼FTP 伺服器將會拒絕任何用戶訪問要求;如果將該項空出,那麼Serv-U 將不會對訪問人數進行控制,直到耗盡所有的系統資源。如果用戶希望自己的FTP 伺服器能夠保持正常運轉的話,那麼最好對來訪的用戶數量進行合理的限制。一般情況下,即使老式的486 機器,在使用Serv-U之後,也能夠在同一時間內為20多名用戶提供訪問支持。
在此之後的一系列復選項中的第一項為「啟動安全功能」。如果用戶沒有選擇該項,那麼任何人通過網路都可以直接進入FTP 伺服器,對伺服器中的任何文件進行隨意地復制,改動,甚至刪除。除了那些擁有小范圍內的個人網路,不希望每次登錄都重復輸入用戶名、密碼等煩雜手續的人之外,用戶一定要確保已經選中了該選項,即啟動了伺服器的安全防範功能。
下一項「ENCRYPT PASSWORDS」在默認情況下也被自動選中。這樣,Serv-U 將會使用與UNIX 操作系統相同的加密機制加密並保存用戶的密碼。如果用戶不選擇對密碼進行加密,那麼所有用戶輸入的口令將會以明文的方式保存在位於S erv-U 安裝目錄下的Serv-U.ini 文件中。
隨後一項用來設定是否需要匿名訪問用戶輸入密碼。默認情況下,該項為空白,這樣那些使用匿名帳號訪問FTP 伺服器的用戶將不被要求輸入口令。需要注意的是這里對匿名用戶密碼的檢測非常簡單,只要匿名用戶輸入符合郵件地址格式的任意字元串即可,S erv-U 不會進一步的判斷用戶輸入的郵件地址是否真正存在。
下一項為預防反超時措施。如果用戶選擇了該選項,Serv-U 將會採用新的記時方式,那些希望通過定期向伺服器發送命令來防止出現超時操作的用戶將不再得逞。
隨後的選項被用來設定是否刪除沒有完整上傳的文件,如果用戶不使用該刪除功能,那麼當有用戶在向FTP 伺服器上傳文件的過程中出現錯誤而沒有實現文件的完整上傳時,Serv-U 將會在硬碟上保留已上傳的內容,從而實現上傳文件的斷點續傳。
下面我們要討論的是跨FTP 攻擊。通常狀況下,當使用FTP 協議進行文件的傳輸時,客戶端首先向FTP 伺服器發出一個「PORT」命令,該命令中包含該用戶的IP地址和將被用來進行數據傳輸的埠號。伺服器在收到該命令後,利用命令所提供的用戶地址信息建立與用戶的連接。大多數情況下,上述過程不會出現任何問題,但是,當客戶端是一名惡意用戶時,可能會通過在P ORT 命令中加入特定的地址信息,使FTP 伺服器與其它非客戶端的機器建立連接。雖然這名惡意用戶可能本身無權直接訪問某一特定機器,但是如果FTP 伺服器有權訪問該機器的話,那麼惡意用戶通過FTP 伺服器作為中介,仍然能夠最終實現與目標伺服器的連接。這就是我們所提到的跨伺服器攻擊。為了防止上述情況的發生,用戶可以選擇「防止跨F TP 伺服器攻擊」的選項,這樣Serv-U在與任何來訪用戶建立連接之前,首先要核實該用戶提供的地址信息是否為其真實地址。任何事情都是兩方面的。我們已經知道通過使用S erv-U 可以防止發生跨FTP伺服器的攻擊,但是,同時我們也放棄了在FTP伺服器和FTP 伺服器之間實現數據傳輸的功能。這是因為Serv-U 只會與那些所提供的地址與地址提供者的實際地址相符的用戶建立連接,用戶將不能遠程式控制制在兩台不同的FTP 伺服器之間進行文件傳輸。
最後的兩個選項用來限制用戶在FTP 伺服器上的最大停留時間,以及規定伺服器中文件和目錄名的大小寫。
該窗口中的其它相關選項我們將會在稍後進行詳細介紹。
用戶帳號管理
用戶使用FTP 伺服器的一個最基本的任務就是添加和管理用戶信息。通過選擇「SETUP」菜單中的「USERS」打開Serv-U 的用戶管理窗口。該窗口可以分為左右兩大部分。其中左邊的窗口用來顯示目前所有已經注冊的FTP伺服器的用戶。任意選中其中一個用戶,其詳細的配置信息將會相應的顯示在窗口的右邊。如果是首次啟動S erv-U,那麼僅會顯示一個名為「DEFAULT」的系統默認帳號。
下面詳細介紹一下建立新用戶帳號的全過程.
首先單擊窗口最右邊的「NEW」按鈕,在隨後的彈出窗口中輸入需要建立的用戶名。這時,輸入的用戶名就會出現在窗口右邊的用戶名一欄中。用戶還可以在該欄中對所建立的帳號名稱進行修改。
隨後用戶可以輸入該帳號將要歸屬的用戶組的組名或建立一個新的組。所謂組是人們為了便於管理數量龐大的用戶群而推出的概念。我們可以把眾多的單個用戶劃分到不同的組里進行統一的管理。因為屬於同一個組的用戶都具有一些共同的屬性,例如用戶密碼,根目錄等,所以用戶只需要對個別具有特殊屬性的帳號進行個別設置即可,這樣就極大的簡化了對用戶帳號的管理和維護工作。需要注意的一點是,「A nonymous」這個特殊的用戶帳號不屬於任何一個用戶組。
在隨後的密碼欄中需要輸入帳號的口令,如果用戶在伺服器的設置中選擇了加密密碼的選項(見前文),那麼所輸入的密碼將自動以加密方式儲存。關於密碼很重要的一點是只有輸入的前8 位字元有效,希望能夠引起廣大Serv-U 使用者的注意。另外,如果用戶在建立新的帳號時沒有輸入相應的密碼,那麼並不意味著該用戶帳號沒有密碼,Serv-U 將會嘗試著尋找是否該用戶帳號屬於某一個用戶組並且該用戶組具有統一的密碼。如果Serv-U 沒有找到相應的用戶組密碼的話,將會拒絕該用戶帳號的訪問。如果用戶確實希望不規定某個帳號的密碼,只要在相應帳號的密碼一欄中輸入「$ #@60;$#@60;None$#@62;$#@62;」即可。上述情況的一個例外是Anonymous 用戶帳號,該帳號沒有密碼,Serv-U 只要求用戶輸入符合郵件地址格式的任意字元串即可。
在「HOME」一欄中,設置FTP 用戶的根目錄,即用戶在成功登錄之後所自動位於的起始目錄。每一個用戶帳號都要有自己的根目錄,否則Serv-U 將拒絕該用戶帳號的訪問。當然,如果該帳號屬於某個組,而該用戶組已經設定了共同的根目錄,那麼用戶就不必對該用戶組內的每個帳號進行重復設置。用戶在輸入根目錄的地址時應當注意必須使用完全路徑,包括盤符。
在「NOTE」一欄中,用戶可以選擇輸入一些對帳號起輔助說明的文字以備將來參考之用。
在用戶窗口右邊最大的一欄用來設定帳號的訪問許可權,從而決定用戶可以訪問哪些文件,並以何種方式訪問這些。Serv-U 按照文件和目錄兩大類別對用戶的訪問許可權進行了劃分。具體來說包括:
對文件的訪問許可權:
READ:允許用戶下載文件;
WRITE:允許用戶上傳文件,但無權對文件進行更改,刪除,或重命名;
APPEND:允許用戶對已有的文件進行附加,擁有APPEND許可權的用戶自動擁有WRITE
許可權;
DELETE:允許用戶對文件進行改動,重命名,或刪除。擁有DELETE許可權的用戶自動擁
有WRITE 和APPEND 許可權;
EXECUTE:允許用戶通過FTP 運行可執行文件。例如,用戶可以遠程運行DOS或Windows
程序。
對目錄的訪問許可權:
LIST:允許用戶取得目錄列表;
MAKE:允許用戶在根目錄下建立新的子目錄;
REMOVE:允許用戶刪除根目錄下的子目錄。
INHERIT:選中該選項之後,對某一目錄設置的訪問許可權將自動被該目錄下的所有子目錄
繼承。
在完成上述所有設置之後,點擊「STORE」按鈕,新建立的用戶帳號將被保存在FTP 伺服器中。
該窗口中的其它選項將會在稍後進行詳細的介紹。
實時監控
用戶在完成FTP伺服器的基本配置之後,就可以向外界提供FTP文件傳輸服務了。我想很多用戶都希望在提供FTP 服務的過程中,能夠實時地對訪問自己伺服器的用戶進行監控,從而一方面既能夠對整個服務過程做到心中有數,另一方面還可以在可能出現意外問題之前,採取及時的防範和補救措施。在這一方面,相信S erv-U 能夠充分滿足大家的需求。
首先,讓我們看一下如何利用Serv-U 實現實時的用戶監控。
選擇「FILE」菜單中的「USER INFO」選項。在彈出窗口中的上半部分將會顯示出所有當前正在與伺服器連接的用戶。用滑鼠點擊其中的任一用戶將會在窗口的下半部分出現該用戶的詳細信息。
在窗口的右下方有一個「SPY ON USER」按鈕,點擊之後出現的窗口將會顯示出特定用戶向FTP伺服器發出以及FTP 伺服器響應的所有命令。該窗口將會跟蹤所選用戶的所有命令,對了解特定用戶在訪問FTP 伺服器的過程中的所有行為提供了可*的依據。
在該按鈕下方還有一個名為「KILL USER」的按鈕,如果用戶發現某個來訪用戶的行為可疑,可能會對FTP 伺服器的正常工作帶來危害的話,可以通過使用該按鈕立即中斷與該用戶的連接,將該用戶踢出FTP 伺服器。
需要注意的一點是,雖然Serv-U 能夠提供實時的用戶監控信息,但是需要耗用很大一部分的系統資源。如果用戶發現系統性能出現明顯下降的話,可以通過窗口右側的「F REEZE LIST」按鈕暫時凍結窗口信息的動態顯示,從而釋放出寶貴的系統資源。
設置伺服器端日誌記錄
除了能夠實時的進行監控之外,Serv-U還提供了強大的日誌記錄功能,從而方便用戶記錄和總結一段時期內Serv-U的運行情況。
選擇「FILE」菜單下的「LOGGING」,彈出日誌設置窗口,用戶可以選擇對哪些事件進行記錄,以及將記錄信息保存到何處。
在該窗口的右側,用戶可以選擇對不同的事件進行記錄,其中包括系統信息,安全信息等,同時用戶還可以設置是將所記錄 畔⑾允駒贇erv-U 的主窗口內,還是保存到某一指定文件內。出於耗用系統資源和備份信息的需要,建議用戶把日誌信息保存到指定的文件內。
需要說明的一點是Serv-U 的日誌記錄文件採用統一的格式,具體如下:
[n] DATE TIME - (xxxx) MESSAGE
最前面的數字「n」代表所記錄信息的類別,分別為:
n=1:系統信息(錯誤信息等);
n=2:用戶發出的FTP 命令;
n=3:文件下載;
n=4:文件上傳;
n=5:安全信息(用戶登錄信息等)
n=6:伺服器響應的FTP 命令;
n=7:WinSock使用記錄;
n=8:DLL文件訪問記錄
另外,括弧中的「XXXX」是Serv-U 賦予每一個來訪用戶的一個唯一的數字標識。
5.設置登錄和退出信息
細心的用戶可能會發現在登錄或退出某個FTP站點時,經常會出現一個窗口,顯示一些包括系統設置,歡迎訪問等在內的信息。那麼如何在S erv-U 下實現這一功能呢?
首先,用戶需要把要顯示給用戶的信息保存在一個文本文件中,然後選擇「SETUP」菜單中的「MESSAGES」,在彈出的窗口中進行設置。
在位於窗口最上方的下來框中,用戶需要選擇將要使用登錄和退出信息的IP地址。因為Serv-U 支持一台機器擁有多個IP,所以用戶需要選擇相應的IP地址。在下面的兩個選項中分別輸入用戶事先已經建立好的包含登錄和退出信息的文本文件的地址。
使用外部連接
所謂外部連接是指那些顯示在某一目錄下指向位於該目錄之外的某一文件或目錄的連接。在用戶端看來,外部連接所指向的文件或目錄就位於當前目錄之下,但實際上他們只是一些起連接作用的虛擬指針。使用外部連接的一個最大好處就是能夠把來訪用戶可能需要的所有資源都集中到一個目錄之中,這樣用戶就可以通過不同的外部連接訪問實際上位於不同磁碟或不同目錄的分散信息。
為了充分利用Serv-U 提供的外部連接功能,用戶首先需要生成一個文本文件保存所有可能會用到的外部連接。文件的具體格式如下:
LINK NAME | SOURCENAME
其中的「LINK NAME」是顯示在用戶當前目錄下的外部連接的名稱,而「SOURCENAME」則是該外部連接實際指向的磁碟或目錄。
例如我們在一個名為「LINK.TXT」的文件中寫入如下一條:
CD-ROM | F:\
這樣在用戶的當前目錄中就會出現「CD-ROM」字樣,點擊之後,就可以直接訪問FTP 伺服器的光碟機。
在配置好外部連接的文本文件之後,選擇「FTLE」菜單中的「FTP SERVER」,在彈出的窗口中找到「PRIMARY FIEL CONTAINING LINK」,然後輸入上述文本文件的完全路徑。在「PRIMARY FIEL CONTAINING LINK」下方有一個「SECONDARY FILE CONTAINING LINK」,該項是用來設定起輔助作用的外部連接文件,可以參照上述方法生成。
設置上傳和下載比例
如果用戶希望自己FTP 站點的使用者不僅僅使用自己提供的資源,還能夠上傳一些有價值的東西供大家共享的話,可以通過使用Serv-U提供的「上傳和下載比例」這一功能實現。
用戶可以在「FILE」菜單中的「FTP-SERVER」,「USERS」和「GROUPS」的彈出窗口中找到名為「U/D RATIOS」的功能按鈕,點擊之後出現設置窗口。用戶可以限制每個FTP 站點的使用者每上傳一個文件後可以下載的文件數。例如,如果將某個用戶的上傳和下載比例設置為1/3,那麼該用戶每上傳一個文件,就可以從F TP 站點下載3個文件。
Serv-U 支持在單個會話過程或全部會話過程的范圍內,按照具體傳輸的文件數目或文件的大小,限制用戶的上傳和下載比例。
使用磁碟限額
隨著用戶數量的增加,一個非常實際的問題就是如何既能夠確保每個用戶都有足夠的硬碟空間可用,同時又防止FTP 伺服器吞食整個機器的硬碟資源。同樣,在這個問題上Serv-U提供了有力的解決方案。
用戶可以分別在「FILE」菜單中的「USERS」和「GROUPS」選項的彈出窗口中找到名為「QUATO」的功能按鈕。點擊之後出現設置窗口,用戶可以首先檢測某個用戶帳號當前所使用的硬碟空間,然後根據具體的情況分別設置不同的用戶帳號所能支配的最大硬碟空間,從而有效的解決硬碟空間不足的問題。
基於IP地址授予或拒絕訪問許可權
選擇「FILE」菜單中的「IP ACCESS」選項,在彈出的窗口中進行設置。
用戶可以在窗口的左邊設置不同的訪問規則,而當前所有的訪問規則將會顯示在右邊的列表中。
Serv-U 提供了兩種基本的訪問規則,分別為「拒絕訪問」規則和「允許訪問」規則。在「拒絕訪問」規則下,所有來自用戶輸入的IP地址的訪問者都將被拒絕訪問,而來自其它I P地址的用戶都將被授予訪問許可權。同理,如果用戶選擇了「允許訪問」規則,那麼所有來自用戶輸入的IP地址的訪問者都將被授予訪問許可權,而來自其它I P 地址的用戶將無權訪問FTP 伺服器。
通過以上功能,用戶可以針對不同的IP地址,設置不同的許可權,從而有效的保障FTP 伺服器免受非法訪問者的侵害。
三.小節
Serv-U 是一款使用簡單,功能強大,易學易用的FTP 伺服器端軟體。相信廣大用戶結合以上的介紹,再加上個人的實踐,一定會在最短的時間內構建起自己的功能強大的FTP伺服器。
3. 請問用java寫FTP,如果想設置當連接失敗後隔一段時間重連,該如何寫
你好,根據你的描述,我覺得可以使用Timer定時器實現。
代碼可以這么寫吧,具體要寫什麼內容,就看你的要求了。
if(連接失敗)
{
Timer timer = new Timer(); timer.schele(new DoFTPConnect(), 0, 30 * 60*1000);
}
希望對你有幫助!
4. FTP客戶端怎麼樣實現斷點續傳的功能
愛米雲共享網盤比ftp好用多了,都不搭伺服器,一鍵安裝的。斷點續傳就是你比如傳文件傳了30%的時候中斷了,再重新傳的時候會從30%開始傳,而不是從0開始。一般ftp只能續傳文件,但愛米雲網盤文件和文件夾都可以續傳。這點確實很方便
5. java 怎麼實現斷點續傳的前端控制項
FTP(文件傳輸協議的簡稱)(File Transfer Protocol、 FTP)客戶端軟體斷點續傳指的是在下
6. Java ftp 斷點續傳報錯
NoClassDefFoundError
1.未通過編譯
2.沒有引入jar包
7. java ftp怎麼實現java ftp方式的斷點續傳
運用類的辦法,編程人員能夠長途登錄到FTP伺服器,羅列該伺服器上的目錄,設置傳輸協議,以及傳送文件。FtpClient類涵 蓋了簡直一切FTP的功用,FtpClient的實例變數保留了有關樹立"署理"的各種信息。下面給出了這些實例變數:
public static boolean useFtpProxy
這個變數用於標明FTP傳輸過程中是不是運用了一個署理,因此,它實際上是一個符號,此符號若為TRUE,標明運用了一個署理主機。
public static String ftpProxyHost
此變數只要在變數useFtpProxy為TRUE時才有用,用於保留署理主機名。
public static int ftpProxyPort
此變數只要在變數useFtpProxy為TRUE時才有用,用於保留署理主機的埠地址。
FtpClient有三種不同方式的結構函數,如下所示:
1、public FtpClient(String hostname,int port)
此結構函數運用給出的主機名和埠號樹立一條FTP銜接。
2、public FtpClient(String hostname)
此結構函數運用給出的主機名樹立一條FTP銜接,運用默許埠號。
3、FtpClient()
此結構函數將創立一FtpClient類,但不樹立FTP銜接。這時,FTP銜接能夠用openServer辦法樹立。
一旦樹立了類FtpClient,就能夠用這個類的辦法來翻開與FTP伺服器的銜接。類ftpClient供給了如下兩個可用於翻開與FTP伺服器之間的銜接的辦法。
public void openServer(String hostname)
這個辦法用於樹立一條與指定主機上的FTP伺服器的銜接,運用默許埠號。
8. java實現ftp斷點續傳問題
//嘗試移動文件內讀取指針,實現斷點續傳
result
=
uploadFile(remoteFileName,
f,
ftpClient,
remoteSize);
//如果斷點續傳沒有成功,則刪除伺服器上文件,重新上傳
if(result
==
UploadStatus.Upload_From_Break_Failed){
if(!ftpClient.deleteFile(remoteFileName)){
return
UploadStatus.Delete_Remote_Faild;
}
result
=
uploadFile(remoteFileName,
f,
ftpClient,
0);
}
9. java ftp上傳時斷網,文件損壞
以二進制流上傳,然後實現斷點續傳。
/**
* 上傳文件到FTP伺服器,支持斷點續傳
* @param local 本地文件名稱,絕對路徑
* @param remote 遠程文件路徑,使用/home/directory1/subdirectory/file.ext 按照Linux上的路徑指定方式,支持多級目錄嵌套,支持遞歸創建不存在的目錄結構
* @return 上傳結果
* @throws IOException
*/
public UploadStatus upload(String local,String remote) throws IOException{
FTPClient ftpClient = new FTPClient();
//設置PassiveMode傳輸
ftpClient.enterLocalPassiveMode();
//設置以二進制流的方式傳輸
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
UploadStatus result;
//對遠程目錄的處理
String remoteFileName = remote;
if(remote.contains("/")){
remoteFileName = remote.substring(remote.lastIndexOf("/")+1);
String directory = remote.substring(0,remote.lastIndexOf("/")+1);
if(!directory.equalsIgnoreCase("/")&&!ftpClient.changeWorkingDirectory(directory)){
//如果遠程目錄不存在,則遞歸創建遠程伺服器目錄
int start=0;
int end = 0;
if(directory.startsWith("/")){
start = 1;
}else{
start = 0;
}
end = directory.indexOf("/",start);
while(true){
String subDirectory = remote.substring(start,end);
if(!ftpClient.changeWorkingDirectory(subDirectory)){
if(ftpClient.makeDirectory(subDirectory)){
ftpClient.changeWorkingDirectory(subDirectory);
}else {
System.out.println("創建目錄失敗");
return UploadStatus.Create_Directory_Fail;
}
}
start = end + 1;
end = directory.indexOf("/",start);
//檢查所有目錄是否創建完畢
if(end <= start){
break;
}
}
}
}
//檢查遠程是否存在文件
FTPFile[] files = ftpClient.listFiles(remoteFileName);
if(files.length == 1){
long remoteSize = files[0].getSize();
File f = new File(local);
long localSize = f.length();
if(remoteSize==localSize){
return UploadStatus.File_Exits;
}else if(remoteSize > localSize){
return UploadStatus.Remote_Bigger_Local;
}
//嘗試移動文件內讀取指針,實現斷點續傳
InputStream is = new FileInputStream(f);
if(is.skip(remoteSize)==remoteSize){
ftpClient.setRestartOffset(remoteSize);
if(ftpClient.storeFile(remote, is)){
return UploadStatus.Upload_From_Break_Success;
}
}
//如果斷點續傳沒有成功,則刪除伺服器上文件,重新上傳
if(!ftpClient.deleteFile(remoteFileName)){
return UploadStatus.Delete_Remote_Faild;
}
is = new FileInputStream(f);
if(ftpClient.storeFile(remote, is)){
result = UploadStatus.Upload_New_File_Success;
}else{
result = UploadStatus.Upload_New_File_Failed;
}
is.close();
}else {
InputStream is = new FileInputStream(local);
if(ftpClient.storeFile(remoteFileName, is)){
result = UploadStatus.Upload_New_File_Success;
}else{
result = UploadStatus.Upload_New_File_Failed;
}
is.close();
}
return result;
}
10. 怎麼用libcurl實現ftp斷點續傳
這個需要FTP server支持append,我之前用它的命令行測試過的,libcurl可以實現斷點續傳。