2013-12-17 53 views
0

我想創建一個網站,用戶可以在其中上傳圖像,視頻和其他類型的文件。 我做了一些research和人們似乎建議將文件保存爲數據庫中的BLOB是一個壞主意;相反,將文件路徑保存在數據庫中。服務器後端:如何爲上傳的文件生成文件路徑?

我的問題是,如果我保存在數據庫中的文件路徑:

1. How do I generate the file names? 

我想過計算文件名的MD5值,但如果兩個文件具有相同的名稱?將用戶名和時間戳等添加到文件名?它有意義嗎?

2. What is the best directory structure? 

如果在二○一三年十二月一十七日,2018年12月18日,我能不能把它放在user_ABC /圖像的用戶上傳圖像/,然後創建時間戳子目錄20131217,20131218等?所有這些東西的最佳結構是什麼?

3. How do all these come together? 

好像維持這個系統是這樣一種痛苦,因爲文件系統操作的腳本是緊密再加與數據庫操作(也可能需要有關數據庫事務的煩惱嗎?說在一個事務中我更新了數據庫,但未能修改文件系統,所以我需要回滾我的數據庫?)。

而且我認爲這個系統沒有規模(什麼,如果我的機器上運行了硬盤,所以我需要將文件上傳到第二臺機器呢?如果我的內容是一個羣集上?)

我認爲我的真正問題是:

4. Is there any existing framework/design pattern/db that handles this problem? 
What is the standard way of handling this kind of problems? 

在此先感謝您的答案。

+0

對於一件簡單的事情來說太麻煩了?如果你不確定爲什麼不去找一個爲你處理這個問題的框架。 – marekful

回答

0

我在設計食品廚師的社交網站時,其實也問過同樣的問題。我決定將圖像的URL與配方一起存儲在MySQL數據庫中。如果您計劃爲一個配方存儲多個圖像,在我的示例中,可能會使用逗號分隔值。當在頁面上加載配方時,我會將與該配方相關的圖像提取到屏幕上。

  1. 由於這是一個黑客馬拉松,並不是爲了生產目的,我沒有將文件名編碼爲獨特的東西。但是,如果我是爲了生產目的而開發的,那麼在將其存儲到服務器和數據庫/後端時,我會將時間戳添加到媒體文件名。

  2. 我相信我所提出的是處理這種情況的最佳數據結構。將圖像存儲到服務器上不僅更快,而且還需要更少的空間。我發現在將合理分辨率的標準jpg文件轉換爲base64編碼時,編碼的文本文件表示佔用了30%的空間。當使用某種BLOB類型的數據格式代替直接將文件存儲在服務器上時,還有時間對文件進行編碼和解碼文件以進行存儲和解析。

  3. 使用某種像PHP這樣的後端服務器腳本,你可以用你可用的信息做一些漂亮的東西。從數據庫中獲取結果,並使用HTML從頁面加載它。

  4. 據我所知,目前還沒有從數據庫中獲取媒體的標準方式。也許會有一天。

0

有沒有標準的方法來做到這一點,它是不同的應用程序。這個想法是你需要爲每次上傳生成一個不同的路徑+文件名,這裏是一個方法:

HashId = sha1(microsecond + random(1,1000000)); 
Path = /[user_id]/[HashId{0,2}]/[HashId{-2}]; 
FileName = HashId 
相關問題