2010-03-29 103 views
1

我想以編程方式將文件上載到ftp服務器(C++)。如果在上傳文件時連接丟失,我不想從頭開始上傳文件,而只上傳我沒有發送的部分。使用FTP「附加」命令

APPE命令是否滿足我的要求?我應該使用什麼FTP命令列表?如何?

回答

5

檢查RFC並且具體地APPEND命令:

這 命令使服務器DTP到 接受經由 數據連接傳送的數據,並 存儲數據在一個文件在服務器現場。如果在服務器站點上的路徑名中指定的文件 存在 ,則應將數據 附加到該文件; 否則應在 服務器站點創建 路徑名中指定的文件。

請注意,您不能簡單地再次添加同一個文件。您應該發送剩餘的字節。也就是說,當連接丟失時繼續保持相同的位置。

5

我在網上搜索有關APPE FTP命令的詳細信息,實際上它做了什麼,但大多數站點只是狀態追加。然後我嘗試一下命令以確保它的行爲如預期。

我設計FTP自動發件人,用於從機器發送日誌文件到服務器進行報告。我只想發送日誌文件的最後一行。

當使用APPE命令時,它實際上附加了整個文件內容並追加到服務器中的現有文件中。這將導致行條目重複。

答案: 待辦事項文件的恢復,如果持續傳輸失敗,對於沒有這樣的命令,但我們需要使用命令序列來實現它。

這裏的關鍵是如果您使用APPE命令或使用命令REST,請將您的本地文件查找到最後上傳的字節。 REST將開始在該特定字節開始位置傳輸。我最終了這個解決方案來執行連接建立後:

使用APPE(我從FileZilla中日誌的想法):

  • 使用SIZE來檢查文件中存在和用它作爲恢復標記。
  • 打開本地文件系統並在標記上查找。
  • 使用APPE上傳,FTP服務器會自動附加。
  • 使用STOR與REST(我從edtFTPnet的想法):

  • 使用SIZE來檢查文件中存在,並使用它作爲恢復標記。
  • 發送REST與從SIZE得到的結果告訴FTP服務器開始在該位置上寫入。
  • 打開本地文件系統並在標記上查找。
  • 使用STOR作爲正常上傳。
  • 請注意並不是所有的FTP服務器都支持這種方式。我看到FileZilla切換這兩種方式取決於服務器。我的觀察表明使用REST是標準方法。下載也可以使用REST在給定的字節位置開始下載。

    請記住,由於Unix和Windows具有不同的換行符字節數,因此使用ASCII傳輸類型的恢復支持將產生意外的結果。

    嘗試操作FileZilla以查看日誌中的行爲。 您也可以查看這個有用的.NET庫的開源FTP,瞭解它們的工作方式。 edtFTPnet