簡體   English   中英

確保所有文件都已上傳到Web服務器

[英]Make sure all files are uploaded to web server

我有一個需要上傳的文件列表,每個文件都是在單獨的請求中上傳的。 我如何確保每個文件都成功上傳,並且如果有任何失敗,它們都失敗了? 我用來上傳文件的代碼是:

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

服務器接收每個文件並將其保存在文件夾中。 我想確保我發送的每個文件都已成功上傳,如果沒有刪除,請刪除服務器上的所有文件。

由於分別上傳每個文件,因此服務器無法知道所有文件是否都成功。

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

如果上載的文件混亂(先前的上載通知了下一個不同的文件),則服務器應中止上載和回滾(根據保存的列表刪除文件),並向客戶端返回錯誤。

為了使此方法正常工作,剩下的唯一事情是注意最后K個文件無法上傳的情況。 在這種情況下,服務器無法自行回滾,因此您必須通知它手動回滾。 您可以通過在捕獲代碼上創建一個新請求來做到這一點。 像以前一樣,當服務器被告知必須回滾時,它應該開始從您的臨時列表中刪除文件,並對客戶端做出錯誤響應。

如果客戶端斷開連接,並且無法將請求發送到服務器,那么您唯一的解決方案是使用cron作業

實際上,有一個完美的手工PHP函數-file_exists('filename'),根據'filename'是否存在,它返回true或false。 如果要遠程存儲文件,則必須包括從根到文件的路徑,因此,在您的情況下,它將是file_exists('files / filename')。 要一次檢查所有文件,只需將另一個for循環與一些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);
    }
}

基本上,這將獲取您要上傳的文件數(假設它是已知的),並運行一個for循環來驗證file [n]是否存在。 對於每個可驗證存在的文件,計數器($ safeFiles)都會增加1。

如果安全文件的數量少於文件數量,或者時間可以精確地整整六十(表示小時標記),則通過另一個for循環逐步刪除上載的文件,該循環使用$ safeFiles作為上限。 刪除本身通過通過unlink()破壞文件引用而發生。

使用unlink()函數有一些陷阱,在這里詳細介紹; 確保將目標數據限制為一個文件夾,以便您必須刪除最少數量的引用。 一旦數據逸出框,您可能需要刪除更多的引用,並且隨着您刪除越來越多的單個文件實例,該功能將變得越來越長。

intval(date('i'))返回以分鍾為單位的時間; 當被60整除時,時間正好是一個小時,例如1300、1400、1100、0100等。這是dandavis建議每小時清除一次服務器的建議,以防止糞便堆積在文件夾中並使系統混亂。

當然,另一種選擇是將檢查/刪除過程所需的數據附加到會話變量,然后將會話數據附加到動態創建的文件夾(在會話過期時刪除)。 這樣,每個用戶都有自己的個人清單,並且您可以從代碼中省略按時間順序刪除。 不利的一面是,它可能要復雜得多,尤其是如果那些文件在給定的時間間隔內僅需上傳一次時,尤其如此。

如果您想讓我解釋基於會話的解決方案,請在評論中提問,我將花一些時間來編寫它。 我現在不會這樣做,因為它顯然比此解決方案要長得多,而且我不確定是否正是您要的解決方案。 如果我已經寫了足夠的內容,感謝您的閱讀並祝您項目順利! :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM