實際上,有這種完美,手工製作的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的建議,每小時清除一次服務器,防止在文件夾中堆積污物並混淆系統。
當然,另一種方法是將檢查/刪除過程所需的數據附加到會話變量,然後將會話數據附加到動態創建的文件夾(會話過期時刪除)。這樣每個用戶都有自己的個人清單,並且可以省略代碼中的時間刪除。缺點是它可能更復雜,特別是如果這些文件只需要在給定的時間間隔上傳一次。
如果你想要我解釋基於會話的解決方案,請在評論中提問,我會花一些時間來寫出它;我現在不會這樣做,因爲它顯然比這個解決方案長得多,我不完全確定它是你想要的。如果我已經寫了夠了,感謝您的閱讀和項目的好運! :)
您需要告訴您的服務器總數和您正在上傳的總數中的哪一個,然後服務器可以決定是否需要刪除或移動。如果你有一個密封的上傳例程,你可以在GET上傳POST參數。 – dandavis
服務器將同時處理來自多個用戶的每個請求,那麼服務器如何知道一切都成功了。例如,假設我上傳3個文件,並告訴服務器我想上傳3個文件。如果只上傳2個文件,則服務器將等待第三個文件(即使失敗)(例如,用戶斷開連接)。 – abden003
它可以等待,使用緩衝區刷新或其他,但這是一個很好的觀點。如果服務器被告知3/3,並且臨時文件夾中只有一個文件,則很容易檢查問題,但是如果放棄了,文件會變得模糊。刪除超過1小時的任何文件的簡單時間作業應該會覆蓋您。 – dandavis