2012-03-24 71 views
1

我遇到了以下問題:我已經有了多步驟的形式,用戶上傳圖片到服務器,然後幾步進一步提供其他信息,當這些信息無效時,被提交 - 也應刪除圖像。在服務器上處理圖片上傳

我在想PHP會議,但是我在這裏PHP - Store Images in SESSION data?,這是低效的方式讀取。每當你在表單中重新加載圖像(在會話中),並且有人提到「你會希望它只有它的大小,並且你需要在你不需要的時候立即刪除它這是因爲會話中的大量信息會減慢會話啓動速度。「 - 這裏我有一個問題:它會減慢上傳文件或所有用戶會話的用戶會話的速度嗎?

我不得不提到我正在尋找解決方案,它不依賴於操作系統的腳本(cron或等) - 我沒有權限來運行這些腳本。

對我來說,完美的解決辦法是:節省了磁盤映像(例如會話ID命名的某個文件夾),那麼形態的最新步驟之後,這張圖片移動,或者根據表單驗證刪除。如果用戶意外地銷燬會話(例如關閉瀏覽器),當然應該刪除具有圖像的文件夾。簡而言之,我需要像callback一樣的事件「銷燬會話」。

回答

1

最好的解決方案是將圖像保存在臨時位置的磁盤上。然後,您可以將文件的文件名存儲在用戶的會話中。

關於清理孤立會話,您可以編寫自己的會話保存處理程序,並使用session_set_save_handler().

有效地設置它,你將需要編寫自己的處理程序打開,保存,讀,寫,破壞和垃圾收集會話。

在你的情況,你將有代碼的破壞和垃圾收集也將刪除連接到會話中不需要的圖像的額外位。

這裏有一個pretty good blog post如何編寫自己的自定義會話處理程序。該示例使用MySQL作爲存儲後端,但您應該能夠將其調整爲您選擇的存儲處理程序。

+0

謝謝你的提示;) – biera 2012-03-24 10:37:13

+0

我對PHP會話沒有太多經驗。我看到我可能需要爲$ destroy編寫自己的回調函數。問題是:它會覆蓋默認行爲還是隻會在默認操作後運行我的回調。我更喜歡後者,因爲我不知道PHP在銷燬用戶會話時究竟發生了什麼,所以我不想搞砸東西...... – biera 2012-03-24 10:53:02

+0

我不認爲有選擇地使用會話的默認行爲。但是,如果您正在使用基於標準文件的會話,則只需簡單地刪除用戶的相應會話文件即可。 – F21 2012-03-24 10:55:49

0

我認爲phpdev的想法是將文件存儲到磁盤上的臨時位置,並在$_SESSION中記錄位置,但我會用一個更簡單的「垃圾」(或不需要的圖像)收集例程。

我綁清除例程一些用戶觸發事件(您無論是圖片上傳,圖像的成功複製出來的臨時目錄中,等的選擇),只是有一個清理例程​​3210或opendir()臨時dir爲所有文件並刪除比預定值更舊的值。

這樣,你可以在「開箱即用」配置會話處理運行,而不必擔心任何自定義會話處理程序。