2011-10-28 40 views
2

想法是這樣的:PHP - 會話臨時文件夾

  1. 用戶上傳文件(S)只存在於當前會話的一些「臨時」文件夾中。
  2. 用戶註冊
  3. 文件形式「臨時」文件夾被移動到永久文件夾又名存儲。

我可以做這樣的事情:

mkdir('tempfiles/'.session_id(), 777) 

和上傳文件:

if (move_uploaded_file($_FILES['my_files']['tmp_name'], 'tempfiles/'.session_id().'/')) { 
    // echo "success"; 
} 

當用戶註冊,文件移動到其他一些文件,臨時文件夾等去除這個:

/* some function to empty dir */ 
rmdir('tempfiles/'.session_id()) 

問題是: 如果用戶上傳後沒有註冊會怎麼樣?如何刪除臨時文件夾?

隨着tempnam功能我可以創建一個文件夾「將其刪除自我」 .. 但在Windows服務器我不能創建例如tempnam('/tmp/test', '');,剛剛成立3個字符的前綴:C:\Windows\Temp\pre569E.tmp

我唯一的想法是寫入臨時文件夾的數據庫路徑。

任何幫助將是最受歡迎的。

回答

2

如果用戶沒有註冊,您必須手動進入並清理這些文件。如果您只保留原始臨時文件,PHP將僅自動清除上載內容。由於您明確將其移出上傳臨時目錄,這意味着清理完全取決於您。

你不能rmdir非空目錄。您必須先刪除該目錄中的所有文件。最簡單的方法是做

$files = glob('tempfiles/' . session_id()); 
foreach($files as $file) { 
    unlink($file); 
} 

更簡單的是不要爲每個用戶創建一個子目錄。將文件移出上傳臨時目錄(以便PHP不會自動清除它),並將其存儲在另一個以session_id()作爲文件名的單箇中間目錄中。這將每個未註冊的用戶限制在一個單獨的文件中,但這可能是一件好事。所有用戶的文件將混雜在一起,但由於每個用戶的文件都有獨特的基於會話的名稱,因此不存在衝突。

您仍然必須清理未選擇註冊的用戶的孤兒文件,但這對於檢查每個臨時文件是否沒有匹配的會話文件都是一件簡單的事情 - 如果存在沒有會話文件,那麼用戶放棄了會話,並且PHP已經刪除了陳舊的會話文件。所以你可以有一個定時的工作做這個交叉檢查並刪除任何沒有匹配會話的文件。

+0

謝謝你解釋的東西。 – enloz