2012-01-19 106 views
34

我不知道大網站如何將圖片保存在他們的服務器上。任何人都可以告訴我他們如何將用戶上傳的圖片保存在他們的數據庫中?在網站上上傳和存儲圖片的最佳方式是什麼?

我在想,也許他們只是將文件(圖片)保存在某個路徑中,並將該路徑保存在數據庫中是正確的?

但我想這樣做。這是正確的嗎?例如,一個名爲www.photos.com的網站。當用戶上傳圖片時,我會創建一個用戶名的文件夾並將這些圖片保存在該文件夾中。

我相信我們可以使用php file concepts創建一個目錄。所以當新用戶上傳他的照片或文件時,我想用他的名字創建一個目錄。

例如:如果用戶名是john,我會在photos.com上創建一個像這樣的目錄www.photos.com/john/,然後當他上傳圖片時將所有圖片保存到此目錄中。這是正確的方法嗎?

我沒有人在這裏有良好的文件保存到服務器的知識,所以請讓我知道如何做到這一點?我想以正確和安全的方式做到這一點。

+2

@AdrianCornish你能告訴我你是什麼意思?我不是要求你爲我寫一段代碼,我只是希望算法或過程是大多數人都遵循的,這樣我就可以繼續前進,如果我知道該怎麼做 – niko

+0

再次嘗試一下你有什麼?您可以存儲文件的路徑,您可以將二進制數據存儲在數據庫中。你真正的問題是什麼? –

+0

你的問題很糟糕 - 你問如何上傳圖片。不是如何將圖片上傳到您的網站。此外,您還在做什麼來保護用戶免於上傳惡意代碼,隱藏有效載荷的圖像,阻止人們從索引網址抓取所有圖像 –

回答

125

所有大網站不保存圖片到數據庫他們將它們存儲在磁盤中。 它們保存對圖片在表格中的位置的引用。然後從那裏鏈接。

爲什麼?性能。

從數據庫中提取大量內容是一個巨大的性能瓶頸。數據庫不能很好地水平擴展,所以這意味着更大的問題。所有大網站都使用靜態內容農場來處理靜態內容,如圖像。那些服務器不會關心你的身份。

他們如何保持圖片真正私密,你可能會問?他們不。

圖片的鏈接本身就是地址和密碼。例如,以Facebook爲例。如果我在我的帳戶中存儲了私人照片,則您無法打開它。但是,只要你有正確的地址,你就可以。

This picture is private注意文件名
10400121_87110566301_7482172_n.jpg
(Facebook的改變,從時間的URL時間,所以鏈接可能被打破)

這是不連續的。獲取圖片的唯一方法是知道它的地址。
基於以前的用戶照片,你不能猜測下一個。
它有一個巨大的熵,所以即使你開始隨機野蠻猜測你會有大量的失敗,如果你確實得到了一張照片,你將無法從那裏認識到擁有者的身份這本身就是匿名保護。

編輯(爲什麼你不應該存儲在「用戶名」文件夾中的圖像:
後您的編輯很顯然,你打算把磁盤上,而不是數據庫文件該編輯介紹新方案。

即使您的邏輯(爲每個用戶創建一個文件夾)接縫更加有序,當您開始擁有許多用戶和許多圖片時,它會產生問題。假設你的服務器有1T磁盤空間。並且讓我們想象1T對於服務器可以處理的負載或多或少是準確的。

現在,您已有11位用戶,假設他們同時開始上傳,並且每個用戶都會上傳超過100GB的文件。當它們達到91GB時,每臺服務器已滿,您必須開始將圖像存儲在不同的服務器上。如果遵循該用戶/文件夾結構,則必須選擇其中一個用戶並將其所有數據遷移到不同的服務器。此外,它還會限制無法在文件中上傳超過1T的用戶。

我應該將所有文件存儲在同一個文件夾中嗎?
不,大網站通常將文件存儲在順序文件夾(/ 000001 /,/ 000002 /等)中,每個文件夾有x個定義數量的文件。這主要是針對文件系統性能問題。

更多關於how many files in a directory is too many?

+14

BRILLIANT解釋。正是我在找什麼,謝謝。 – CyberJunkie

+0

謝謝弗蘭基,這的確很清楚。但還有另一種更加有趣的方式:將圖片存儲在特定的圖片存儲提供商上。 – Fred

+1

@Fred絕對正確。這個答案專門設計用來爲那些不知道事情如何工作的人設定正確的心態。只要您開始在您的網站上託管幾百萬張照片,您可能會想要拆分問題和/或外包託管這些資產。儘管如此,心態仍然保持不變。在數據庫中,您只能引用圖像位置。感謝您的評論。 – Frankie

4

它通常是一個壞主意,在數據庫中存儲的圖像(如果你的網站很受歡迎)。傳統上,數據庫是大多數應用程序中的主要瓶頸之一。無需加載超過需要。如果圖像在文件系統中,許多http服務器(例如,nginx)將最有效地服務它們。

俄羅斯最大的社交網絡Vkontakte正是如此:將圖像存儲在文件系統中。

另一個大型社交網絡實現了先進的可擴展blob存儲。但AFAIK並未向公衆開放。

對此答案的總結:不要在數據庫中存儲斑點。

1

圖像管理最好通過物理上傳圖像到服務器,然後在數據庫中記錄文件位置和圖像細節來實現。隨後,可以配置搜索表單以允許用戶進行文本搜索,零件號搜索或其他查詢。可以編寫PHP腳本來根據表中的數據生成有效的HTML圖像標記。

將圖像上傳到MySQL™BLOB字段是一個糟糕的主意,如果圖像比縮略圖大得多,這種圖像數據通常是有問題的。如果圖像很大,您最終可能不得不一次複製/粘貼一條SQL INSERT語句(進入phpMyAdmin)。如果圖像很大,並且文本編輯器將SQL INSERT語句分成兩行,則永遠無法恢復圖像。

2

是這樣做

是正確的方式。
我建議使用的唯一不是名稱而是id。
www.photos.com/albums/1234/會對起動者好。

相關問題