簡體   English   中英

你如何處理PHP中的臨時圖片上傳?

[英]How do you deal with temporary picture uploads in PHP?

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

當玩家更改其數據(其中包含圖片),然后點擊“保存”時,服務器端驗證就會啟動。它會檢查非唯一字符名稱,空必填字段等內容。如果發現任何錯誤,顯示。 在這種情況下,表單應該預先填充玩家輸入的數據,因此他只需要更改故障位,而不是重新輸入所有內容。 但是如何將圖片保存在這種“臨時”狀態?

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

你會如何解決這個問題?

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

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

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

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

使用表單數據傳遞引用記錄的id。 重新顯示表單時顯示圖像,因此用戶知道他們不必重新上載。

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

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

您可以隨時填充禁用的文本框以保存圖片的名稱 - 它不會填充瀏覽輸入字段,但總比沒有好。 對於編輯,為避免沖突,您可以為每個用戶的字符創建一些“修改”列,並在字符編輯請求中將值更改為true。 當用戶保存角色時,將其設置為false。 對於每個編輯請求,僅在“修改”為假時才授予它。

我建議立即更新圖像,無論表單中的錯誤如何,或者將圖像更新分離為單獨的表單。 這樣,沒有復雜的狀態機和清理,你就可以解決兩個問題。

暫無
暫無

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

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