2016-01-21 93 views
0

我有我需要上傳的文件列表,每個文件都在單獨的請求中上傳。我如何確保每個文件都能成功上傳,如果有失敗,它們都會失敗?我使用上傳的文件中的代碼是:確保所有文件都上傳到網絡服務器

for (var i = 0; i < files.length; i++) { 
    upload(files[i]).then(function(d) { 
    // success 
    ... 
    }).catch(function(d) { 
    // fail 
    ... 
    }); 
} 

服務器接收的每個文件和文件夾下保存它。我想確保我發送的每個文件都成功上傳,如果不刪除服務器上的所有文件。

+0

您需要告訴您的服務器總數和您正在上傳的總數中的哪一個,然後服務器可以決定是否需要刪除或移動。如果你有一個密封的上傳例程,你可以在GET上傳POST參數。 – dandavis

+0

服務器將同時處理來自多個用戶的每個請求,那麼服務器如何知道一切都成功了。例如,假設我上傳3個文件,並告訴服務器我想上傳3個文件。如果只上傳2個文件,則服務器將等待第三個文件(即使失敗)(例如,用戶斷開連接)。 – abden003

+0

它可以等待,使用緩衝區刷新或其他,但這是一個很好的觀點。如果服務器被告知3/3,並且臨時文件夾中只有一個文件,則很容易檢查問題,但是如果放棄了,文件會變得模糊。刪除超過1小時的任何文件的簡單時間作業應該會覆蓋您。 – dandavis

回答

1

由於您單獨上傳每個文件,您的服務器無法知道它們是否都成功。

你可以做的是在每次上傳時通知你的服務器下一個文件來。 通過這樣做,您可以在服務器端(在會話/數據庫/臨時文件上)保留一個列表,其中包含已上傳的文件和下一個文件。

如果上傳的文件出現故障(先前的上傳已通知其他文件爲下一個),則服務器應中止上載和回滾(根據您保存的列表刪除文件)並返回客戶端錯誤。

爲了正常工作,唯一剩下的事情就是照顧最後K個文件無法上傳的情況。在這種情況下,服務器不能自行回滾,所以你必須通知它回滾到manualy。你可以通過在你的catch代碼上創建一個新的請求來做到這一點。像以前一樣,當服務器被告知必須回滾時,它應該開始從臨時列表中刪除文件,並向客戶端返回錯誤。

如果客戶端disconected,不能發送請求到服務器,然後你唯一的解決方案是使用cron作業的

0

實際上,有這種完美,手工製作的PHP函數 - file_exists(「文件名」) ,根據是否存在'filename'來返回true或false。如果你的文件被遠程存儲,你必須包含從根到文件的路徑,所以在你的情況下,它將是file_exists('files/filename')。要檢查一次所有的文件,只需要使用另一個用於循環使用一些if語句(以下假定PHP和可預見的文件名)合併:

$numOfFiles = numOfFiles; 
$fileChecker; 
$fileKiller; 
$safeFiles = 0; 

for ($fileChecker = 0; $fileChecker < $numOfFiles; $fileChecker += 1) { 
    if (file_exists('files/file' . $fileChecker)) { 
     $safeFiles += 1 
    } 
} 

if ($safeFiles < $numOfFiles or intval(date('i')) % 60 === 0) { 
    for ($fileKiller = 0; $fileKiller < $safeFiles; $fileKiller += 1) { 
     unlink('files/file' . $fileKiller); 
    } 
} 

基本上,這需要的文件,你要上傳的數量(假設它的foreknown),然後運行for-loop來驗證文件[n]是否存在。對於每個具有可驗證存在的文件,計數器($ safeFiles)都會加1。

如果安全文件的數量少於文件數量,或者時間可以被60整除(表示小時標記),則上傳的文件將通過另一個for循環逐步刪除,該文件使用$ safeFiles作爲上限。刪除本身通過通過unlink()銷燬文件引用而發生。

使用unlink()函數有一些缺陷,詳細請見here;確保將數據限制在一個文件夾中,以便您必須刪除可能的最少數量的引用。一旦數據越過它的方框,你就可以有更多的指向刪除的引用,並且隨着你刪除越來越多的單個文件的實例,該功能可能變得越來越長。 int(date('i'))返回以分鐘爲單位的時間;當可以被60整除時,時間恰好在一小時,例如, 1300,1400,1100,0100等。這遵循dandavis的建議,每小時清除一次服務器,防止在文件夾中堆積污物並混淆系統。

當然,另一種方法是將檢查/刪除過程所需的數據附加到會話變量,然後將會話數據附加到動態創建的文件夾(會話過期時刪除)。這樣每個用戶都有自己的個人清單,並且可以省略代碼中的時間刪除。缺點是它可能更復雜,特別是如果這些文件只需要在給定的時間間隔上傳一次。

如果你想要我解釋基於會話的解決方案,請在評論中提問,我會花一些時間來寫出它;我現在不會這樣做,因爲它顯然比這個解決方案長得多,我不完全確定它是你想要的。如果我已經寫了夠了,感謝您的閱讀和項目的好運! :)

相關問題