2011-09-20 63 views
1

我正在玩使用FTP定期將小型數據文件從程序上傳到服務器。用戶通過使用JavaScript XMLHttpRequest函數讀取數據的網頁訪問數據。這一切似乎工作,但我正在努力解決FTP和XMLHttpRequest導致的一些問題。我想到的唯一想法是重試失敗的上傳,並檢測失敗的XMLHttpRequests或返回不完整數據並重試這些失敗的XMLHttpRequest。FTP同步

我想使用像FTP這樣簡單的東西,因爲應用程序的用戶可能無法託管服務器(它們可能在NAT路由器後面,並且沒有固定的IP號碼),並且無法訪問任何花哨的外部服務器。

任何人有任何建議嗎?

+0

這是如何工作的?聽起來像它會違反同源政策。 – Anders

+1

不確定你的意思。 JavaScript和數據文件存儲在同一臺服務器上的相同目錄中。 –

回答

1

如果通過將文件上傳到臨時名稱然後重命名文件來避免文件鎖定問題該怎麼辦?

pseduo代碼:

FTPSend "c:\readme.txt" /as "readme.txt.tmp" 
if error retry FTPSend 
FTPRename "readme.txt.tmp" /as "readme.txt" 
if error retry rename 

當然,你也想限制的時間量你花重試失敗的操作,它不會在一個循環中掛起。

+1

好主意。在我試過的服務器上,必須刪除舊文件b4,您可以重新命名新上傳的文件。所以當文件不存在時有一個窗口。奇怪的是,可以用上傳替換現有的文件,但不能用重命名。仍然可能比我正在做的更好。 –

1

廢話FTP(它不是NAT友好的),並通過HTTP上傳。您已經有一個可以處理HTTP的系統(因爲您使用的是XHR)。您可以通過POST請求接受重載,並在覆蓋現有內容或宣佈新內容之前包含一些完整性檢查。

+0

使用WinINet API函數將上傳內部完成到C++應用程序。我不熟悉WinINet的http部分;那些會是你建議的例子嗎? –

+0

我試着用WinINet http post上傳文件。所有返回的狀態值都可以,但沒有任何內容寫入服務器。文件是否存在或不在文章之前並不重要。 –

+0

POST不會創建文件(PUT),它只是發送消息,您需要一個處理程序來解析表單數據並創建文件。 – Quentin

0

我的應用程序專供那些無法訪問他們可以控制的服務器的人使用。即他們很可能會使用由他們的ISP或一些免費的FTP站點提供的文件空間。因此任何http發佈功能都不起作用。

因此,我使用上面的重命名建議的FTP。

1)刪除文件TEMP.htm如果它存在 2)上傳filr TEMP.htm 3)刪除目標文件,重試次數 4一些數)重命名TEMP.htm到目標文件

有在3)和4)之間有一段時間,當沒有目標時,網絡引用它可能會失敗。使用這些文件的頁面也必須重試訪問。