2012-10-04 62 views
1

我有一個PHP腳本,用戶可以上傳圖像。該圖像存儲在臨時目錄中並返回給用戶。用戶然後可以使用JavaScript界面​​裁剪圖像。 (x1,y2)(x2,y2)被髮送到用於裁剪圖像的腳本。然後將其返回給用戶進行另一個預覽和\或裁剪。一旦用戶足夠滿意,他將點擊「保存」。臨時文件被複制到原始文件並刪除臨時文件。這些不是每個用戶的圖像,而是設備的圖像。組織中的任何用戶都可以替換設備的任何圖像。這種方法是好的,但也有一些問題:在PHP中處理臨時文件情況的好方法

1)假設用戶上傳的預覽圖像,但然後關閉瀏覽器窗口。我將留下一個臨時文件。這可能成爲一個問題。當然,我可以讓CRON清理它們,但理論上我可以擁有大量的臨時文件(這很醜陋)。 cron還可以在編輯過程中刪除用戶的臨時文件。

2)爲了處理數1 I總是可以有每件設備的一個臨時文件,如equip1.temp和equip1.jpg。所有上傳都存儲在equip1.temp中,所有提交都轉移到equip1.jpg。如果兩個用戶試圖在同一時間上傳同一臺設備的圖片,這可能混亂起來(可能性很小+不是一個問題,但還是醜)

3)我總是可以通過圖像來回(用戶「上傳」圖像並將其回顯爲<img src="base64....." />。生成的edits +原始base64字符串將被髮送回PHP進行處理)。此解決方案可以解決臨時文件問題,但我發現需要幾秒鐘來回發送高分辨率圖像。

你會如何處理這種情況?

+0

使用選項#2,而且還包括在文件名中'用戶id',如'equip1-user123.temp'。 – air4x

+0

如果user123離開計算機而又不再回來,該怎麼辦?臨時文件將永遠存在。如果用戶被允許一次只編輯一個圖像,那麼N個用戶有N *#個文件 – user974896

+0

,您可以將該文件名保存在用戶表中。然後定期運行一個cron,刪除用戶表中不存在的文件。 – air4x

回答

1

由於您提到的原因,我不會推薦#3。

我建議你這樣做,而不是:

  1. 用戶上傳文件到一個隨機的臨時名稱。 equip1.jpg儲存爲equip1_fc8293ae82f72cf7.jpg。請確保你的腳本能夠同時處理兩個文件名。它將允許兩個用戶上傳相同的設備,最後一個上傳者將成爲贏家,但不會出現衝突。
  2. 每次你的裁剪工作與臨時圖像,你應該「觸摸」它來更新修改時間。
  3. 讓用戶完成編輯,移動臨時文件以代替最終圖像名稱。
  4. 有一個cron或上傳器腳本的一部分,用於刪除mtime大於1小時左右的廢棄臨時文件。你建議這很麻煩,因爲很多臨時文件的潛力,但你是否期望有很多圖像被放棄?垃圾收集是解決這個問題的一個非常標準的方法。
+0

如果用戶上傳,收穫,預覽,並且直到> 1小時後才提交(他不得不參加會議),那麼他的工作將會丟失。 – user974896

+0

我說了一個小時,因爲我覺得你對空間的關注比什麼都重要。您可以將其設置爲24小時以上。在某些時候,如果用戶在週末之後回來,您將不得不處理該錯誤,但它可以很好地處理大多數情況。 – jimp

2

我有類似的問題。如果我記得正確(它有一段時間),我最終創建了一個DB中的表來存儲文件名和會話密鑰/時間。每次加載腳本時,如果數據庫中存在死區,會話和映像/文件被刪除。

我不知道這是否是一個好的解決方案,但它解決了我的多用戶訪問問題。

相關問題