2009-11-07 63 views

回答

0

這裏是存儲在MySQL數據庫上的二進制圖像的example。我不太確定是否有任何優勢。我會留給別人評論。

你可以做的另一種方式是存儲圖像的位置在一列,它查詢引用。

+1

是的,我會建議反對,除非有某些原因需要保護圖像。通過這樣做,首先需要從數據庫中提取圖像,然後處理二進制文件。這將增加PHP服務器以及MySQL服務器的負載。你的第二條建議是更好的;將圖像存儲在用戶圖像文件夾中,或許用uniqid()命名它們,然後在數據庫中引用該相對URL。 – BraedenP 2009-11-07 05:34:06

2

如果我是你,我只是將圖像保存在你的網站目錄的某個地方,然後將鏈接保存到MySQL中的圖像,如果你真的想將它保存在數據庫中,我會把它讀入一個字符串,然後base64_encode()它,然後將其保存在數據庫中。

有您將它們存儲在數據庫中遇到一點麻煩的種種,你必須創建腳本來呼應他們回來了ECT,以及服務器和數據庫負荷將大大增加。如果我是你,我只是存儲參考。

1

我建議有您存儲喜歡的用戶名,名字用戶數據的表。在該表中創建一個名爲「avatar」的字段,您可以在其中存儲文件引用。

假設你的用戶頭像都存儲在:htdocs中/圖片/化身/ 而用戶apikot有阿凡達「avatar.jpg」存儲agains它的用戶在數據庫中,然後你可以生成圖像標籤時,編譯以下網址:「/htdocs/images/avatars/avatar.jpg」。

0

創建一個BLOB類型字段,並插入的file_get_contents($鏡像文件)

16

的結果,「最佳」取決於你的目標是什麼。

存儲用戶上傳圖像的兩種主要方式是將二進制內容作爲BLOB放入數據庫,或將圖像存儲到某處的驅動器,並向數據庫中放入指示哪個圖像屬於哪個位置的條目。

將圖像放置在數據庫中的優點是不需要在網絡服務器上具有任何類型的文件系統權限,並且在您從多個網絡服務器提供網站時刪除任何類型的同步問題。但是,隨着時間的推移,它會使您的數據庫變得龐大,如果您沒有正確設計表格,它絕對會損害您的性能和可伸縮性。

在文件系統中存儲的圖像以文件有使檢索極其快速,高效的附加優勢,因爲Web服務器是在提供靜態文件非常好。

編輯補充

如果你決定要在數據庫中存儲的文件內容,絕對不要把它放在需要快速訪問的表。例如,如果您有幾乎每個綜合瀏覽量都搜索到的「用戶」表,那麼該表是而不是放置文件內容的地方。相反,請創建一個包含文件和相關元信息的單獨「圖像」或「文件」表。

投入大量每行的字節到表使得該表很慢的工作。你不想在桌子上看到那種看起來很重要的東西。

+0

如果你打算使用數據庫,這是一個非常好的主意。爲了減輕圖像表上的負擔,使用memcache來緩存圖像也會有所幫助。 – BraedenP 2009-11-07 05:38:17

+0

推論:如果您的文件內容需要快速訪問,請不要將其存儲在數據庫中。 – 2009-11-07 05:40:24

13

圖片應該被存儲在文件系統上的一對夫婦的原因:

  • 代理和IF-Modified-Since的Web請求: Apache可以處理如果-Modified-Since的HTTP標頭爲你並返回一個304響應,這就是您可以獲得的最佳性能。在互聯網服務提供商處發佈的反向Squid代理和代理將嘗試利用這一點。

  • 病毒掃描:如果你允許任何文件上傳,混蛋將嘗試上傳可怕的東西,看看他們是否可以破壞你的網站。想要對您的用戶上傳運行ClamAV等來查看是否存在問題並非不合理。如果您想掃描記錄中的惡意軟件,則不會希望捆綁數據庫。

  • 模式簡單:如果您允許文件上傳,您還需要添加有關MIME類型,文件大小,高度和寬度的元數據。如果文件本身與表中的MIME類型不匹配,那麼您需要對錶中的選擇進行編碼並將其流式傳輸到/usr/bin/file。它可以更簡單shell_exec("/usr/bin/file /path/to/mumble")

  • 拇指釘釘:用戶圖片上傳很可能需要進行拇指釘釘,而且這通常比實際的web請求異步更容易。當一些好的用戶試圖上傳他們的專業攝影師夥伴給他們的150MB photoshop文件時,並且你的apache實例在試圖在web worker的內存空間中加載ImageMagick庫時會OOM,這真的沒有樂趣。這對於apache工作人員來說確實不成比例。在Apache之外創建一個工作隊列/ cron作業來處理這項工作。

  • 表損壞:哇,如果您的MySQL索引文件變爲borked並且您需要在該表上執行脫機表修復,您並不是真的想要削弱所有用戶頭像。

  • 備份和恢復:你並不是真的想用mysqldump鎖定一個大表。使用rsync將爲您節省大量時間併爲您提供更多的靈活性。表格通常會在整個表格中一次性恢復 - 表格通常不會以較小的片段進行備份。

3

在服務器上爲每個用戶創建一個新的目錄,其中用戶標識爲目錄的名稱並將用戶的圖像保存在其中。每當你想顯示用戶的圖像:

<img src="<path>/users_images/<user_id>/thumb.gif" /> 
相關問題