我找不出一個很好的解決方案來限制用戶使用他的文件訪問的存儲量。如何創建限制應用程序中用戶存儲的解決方案?
在應用程序中,用戶可以上傳一定數量的文件。限制基於文件總大小。即用戶可能被允許在服務器上存儲50 Mb。
該號碼存儲在數據庫中,以便可以輕鬆增加/減少。
使用的語言是PHP,但我想解決方案不依賴於腳本語言。
非常抱歉,如果問題不清楚。我真的不知道要問什麼,而不僅僅是一個實施策略。
謝謝!
我找不出一個很好的解決方案來限制用戶使用他的文件訪問的存儲量。如何創建限制應用程序中用戶存儲的解決方案?
在應用程序中,用戶可以上傳一定數量的文件。限制基於文件總大小。即用戶可能被允許在服務器上存儲50 Mb。
該號碼存儲在數據庫中,以便可以輕鬆增加/減少。
使用的語言是PHP,但我想解決方案不依賴於腳本語言。
非常抱歉,如果問題不清楚。我真的不知道要問什麼,而不僅僅是一個實施策略。
謝謝!
跟蹤已使用多少空間應該很簡單 - 每次上傳都可以存儲另一個表中使用的空間。 PHP filesize()
函數會告訴你磁盤上文件的大小。使用SUM()
SQL查詢來獲取每個用戶上傳的所有文件的總大小,並將其與其配額限制進行比較。
棘手的一點是,當你接近極限時 - 你不能分辨文件上傳之前會有多大。所以你必須讓用戶上傳一個文件,然後檢查它的大小,看看它是否超過配額。如果文件太大,請刪除並讓用戶知道他們的空間不足。
一個簡單的方法是將用戶上載的文件名,日期和大小存儲在數據庫中。然後,當超過總存儲空間時,您可以輕鬆拒絕上傳。
這也可以很容易地顯示以各種方式排序的文件列表,允許用戶接近他們的限制選擇一些文件進行刪除。
你甚至可以使用用戶上傳的文件的平均大小來警告他們,當他們快要佔用他們所有的空間時。
有趣的想法。可能會做一個變化。 – Christoffer 2009-10-09 09:34:05
drewm的解決方案很好,我只想添加他提到的棘手部分的幾句話。
是的,在上傳文件之前無法預測文件大小,因爲您無法在用戶的文件上傳頁面使用javascript檢查文件大小。不過,您可以使用基於Flash的文件上傳器(例如swfupload.org)來完成此操作。通過使用它,您可以在上傳開始前檢查文件大小,並根據您的上傳限制進行檢查。這樣你將爲用戶節省時間(不需要上傳文件來獲得「限制超出錯誤」的信息)。
作爲獎勵,您還可以顯示用戶上傳進度條。
不要忘記OS解決方案。如果文件存儲在「用戶」特定目錄中,則可以使用操作系統查找該目錄中使用的磁盤空間。一個Linux解決方案就像這樣:
$dirSize = explode("\t", `du -ks $userDir`); // Will return an array of size, dirName
if ($dirSize[0] > MAX_DIR_LIMIT) print "USER IS OVER QUOTA";
我發現跟蹤文件在兩個操作系統和一個數據庫長期導致問題。在某個時候,腳本會中途失敗,並且最終會在文件夾中沒有數據庫反映更改。或者更糟糕的是你會想將文件移動到新的分區/目錄結構,現在你必須更新數據庫。我儘量避免數據跟蹤數據。操作系統將永遠是正確的 - DB *可能是正確的。另一種方法是將文件保存爲數據庫中的「blob」 - 然後操作系統無法播放。 – ChronoFish 2009-10-09 13:45:43
我將使用三者的變體。但這將是主要的解決方案。 – Christoffer 2009-10-09 09:50:15
對於某些用戶體驗,您還可以使用一些JavaScript來計算要上傳的文件大小,如果大於分配的數量,請在它達到您的服務器之前拒絕它。你仍然需要服務器端的代碼,但是你可能會限制你的用戶在等待這麼長時間以後纔會上傳文件,以告訴他們空間不足。 – 2009-10-09 09:54:21