2009-09-15 41 views
3

我正在用PHP創建一個在線遊戲,用戶可以創建可玩角色。每個角色都可以有用戶上傳的肖像。玩家可以同時擁有多個角色,並且隨時可以更改他們的圖片。自然,圖片必須調整大小並重新壓縮以避免大文件。這裏是我的問題:你如何處理PHP中的臨時圖片上傳?

當玩家改變了數據(其中的圖片),然後在擊中「保存」,服務器端驗證踢它檢查之類的非唯一字符的名稱,空的必填字段等。如果發現任何錯誤,則顯示它們。在這種情況下,表單應該預先填入玩家輸入的數據,所以他只需要更改錯誤位,而不是重新輸入所有內容。但是,你如何將這張照片保存在這種「臨時」狀態?

我無法預先填充文件上傳字段,瀏覽器不允許這樣做。如果我將它保存在一個臨時文件中,則必須在某個時候清理圖片,因爲玩家可以簡單地關閉瀏覽器並中止整個過程。那應該是什麼時候?我應該爲臨時文件選擇什麼文件名?如果玩家在兩個瀏覽器標籤中打開相同的角色進行編輯,他們不應該衝突(他們每個人都應該擁有自己的副本)。

你會如何解決這個問題?

回答

10

我會將文件保存到臨時位置,並將唯一標識符以及當前時間戳存儲在文件名中。然後將文件名放在用戶的會話中。當用戶成功創建或更新其帳戶時,將圖像文件保存到其永久位置並刪除臨時文件。您可以運行一個cron進程來掃描臨時目錄並檢查時間戳,刪除超過過期的任何文件(可能是一個小時)。

如果您無法運行cron作業,則每次創建/更新驗證成功時都可以啓動目錄清理。這可能會更低效(對於每次成功提交,額外的目錄讀取和可能的文件操作),但除非您處理大量流量,否則您可能不會注意到。

+0

不錯的答案。 Upvoted。然而,聽起來很奇怪,我的客戶不喜歡cron工作,因爲他沒有和他們打交道,也不想要新的未經測試的東西。也許你可以在沒有cron作業的情況下想出另一個解決方案? – 2009-09-15 18:47:58

+0

當然,只需將目錄清理整合到圖像上傳處理代碼中即可。創建/更新驗證完成(成功)並刪除臨時映像文件後,掃描目錄的其餘部分以查找過期映像並刪除它們。 – pix0r 2009-09-15 19:07:47

+0

呃...這是一個選項。實際上,我已經決定將它存儲在會話中而不是臨時文件夾中(我將會話存儲在MySQL中)。由於調整後的圖像會很小,我認爲這不是什麼大問題。 – 2009-09-15 19:16:01

0

創建一個表來保存對圖像的引用。

上傳文件時,如果它是一個有效的圖像,請執行所有調整大小等操作,並在表中創建一個指向該文件的記錄。

傳遞參考記錄的ID與表單數據。當您重新顯示錶單時顯示圖像,因此用戶知道他們不必重新上傳。

當你最終接受新的角色對象時,設置avatar_id或其他。

運行常規cron-job來剔除孤立的圖像記錄(同時刪除磁盤上的文件)。

0

你總是可以填充一個禁用的文本框來保存圖片的名稱 - 它不會填充瀏覽輸入字段,但總比沒有好。爲了進行編輯,爲避免衝突,您可以爲每個用戶的角色創建一些「修改」列,並在角色編輯請求中將值更改爲true。當用戶保存該字符時,將其重新設置爲false。對於每個編輯請求,只有在「修改」爲false時才授予它。

+0

當用戶只需打開編輯窗體關閉選項卡就會變得非常尷尬。鎖不會被解除,他不能編輯任何其他東西。 – 2009-09-15 18:49:43

0

我建議要麼立即更新圖像,不管表單中有錯誤,要麼將圖像更新分離爲單獨的表單。這樣你就可以擺脫兩個問題而不需要複雜的狀態機和清理。

+0

以使UI更煩人爲代價。 :( – 2009-09-15 18:54:08

+0

也許是這樣,但我仍然會追求這一點,因爲讓事情變得比他們要複雜得多,只是要求麻煩,只是我的2c。 – 2009-09-15 19:03:17