2012-02-28 114 views
0

我正在開發一個使用Yii框架的網站。在我的網站上我有用戶配置文件(已經實施)。我將有一個文件上傳器,以便用戶可以上傳配置文件圖像。一些配置文件可能公開,其他配置文件可能是私有的。公共用戶應該無法訪問私人配置文件,除配置文件的所有者外,此配置文件中的圖像可能無法訪問任何人。如何私密存儲用戶個人資料圖片,以便只能由個人資料所有者訪問?

我已經讀過,將圖像存儲在MySQL數據庫中是一個壞主意,因爲它會殺死性能,並可能會在我的虛擬主機上被禁止。我曾考慮將圖像存儲在受保護的目錄中,但如果在這裏完成,我將無法鏈接到圖像。那麼我怎麼能夠在有效的配置文件(公共配置文件或屬於用戶的配置文件?)上顯示圖像?

任何暗示或想法將不勝感激(與Yii,PHP或任何其他)。如果我的問題不清楚,請告訴我。謝謝。

*順便說一句,我從來沒有正式的網絡開發課程,和其他許多人一樣,我已經在自己的時間學到了我所知道的一切,所以很可能我錯過了一個非常簡單/明顯的解決方案。

+1

聽起來像它是你需要解決的架構的實現。您應該存儲他們是私人或公共的用戶類型,然後檢查查看者何時試圖查看某人的個人資料。如果他們未以他們試圖查看的配置文件的(私人)用戶身份登錄,請不要向他們顯示任何內容。 – thescientist 2012-02-28 18:50:42

+0

感謝您的回覆。我想我對此並不完全清楚。我已經按照你的建議(私人和公共用戶)實現了它,並且破解url的用戶被髮送到一些錯誤頁面/拒絕訪問頁面。然而,我擔心的是,「聰明」的用戶仍然可能通過一些URL黑客訪問私人用戶的圖像(因爲圖像存儲在公共領域)。如上所述,我不想將其存儲在受保護的域中的原因是,我無法在用戶頁面上顯示圖像,但也許我錯誤地認爲這是錯誤的? – Denzil 2012-02-28 19:02:14

回答

1

用戶上傳圖像後,獲取隨機圖像名稱,例如。 mt_rand(30,999)。 imageExtension。
將該值作爲用戶圖像名稱存儲在image表中。圖片表 包含它自己的id,user_idname列。

在Yii Image模型中創建protected function afterSave()方法,該方法將您的圖像存儲在文件系統上。文件系統中的真實圖像名稱將由數據庫中的圖像ID和數據庫中的圖像名稱組成。
不要忘了跟隨着的行添加到該函數:

return parent::afterSave(); 

例:
你叫me.jpg
mt_rand JPG圖片(30999)爲我們提供了421
所以您存儲的JPG圖像數據庫。
該行有值:
id=7, user_id=3, name=421.jpg
現在,你可以用7_421.jpg的名字保存了圖片。
通過這樣做,您的圖片永遠不會獲得兩次相同的名稱,因爲我們在圖片名稱的第一部分使用的id是唯一的。此外,沒有人會知道圖像的名稱,因爲她/他將需要id和隨機數。

要通過做只爲你比較登錄的用戶ID是一樣的user_id 所有者顯示圖像:

if(Yii::app()->user->id === $image->user_id) { 
// display photo 
} 

你並不需要採取會話的照顧。 Yii爲你做。

+0

嗯,謝謝。我已經有了工作,但方式稍有不同。我接受你的答案,因爲你似乎已經仔細考慮過了,這在我看來是最清楚的。在我目前的實現中,我將圖片保存在公有領域的範圍之外,然後通過php文件提供圖片。我想我會稍微改變一下,以便更像這樣(最終必須達到一定程度)。 – Denzil 2012-02-29 17:07:25

2

服務圖像直通一個php文件,可以檢查它們當前會話是否有權限

+0

好的謝謝。我不知道如何做到這一點,但我會查找它。 – Denzil 2012-02-28 20:32:33

2

用戶上傳他的PIC後,隨機命名的圖像,並存儲在用戶表中的隨機文件名。

用戶登錄後,您當然會設置會話(至少是用戶ID)。

創建image_profile.php並從該文件中的會話獲取user_id。在此之後,執行這樣的查詢:

SELECT `profile_image_filename` 
FROM user WHERE user.id = {$SESSION['user_id']} 
LIMIT 1; 

,然後發送{$profile_image_filename}.jpg,這樣的image_profile.php結果將是登錄用戶的個人資料圖片。 (如何動態輸出圖像?Output an Image in PHP

+0

這聽起來像我可以在沒有太多工作的情況下代表我學習。謝謝您的幫助! – Denzil 2012-02-28 20:35:20

+1

而不是隨機化文件名,將圖像存儲在服務器可以讀取的無法訪問的路徑上,然後它將真正成爲「私密」 – miki 2012-02-28 21:29:30