2011-12-02 108 views
0

我需要將圖像數據存儲在數據庫中。我將圖像上傳到服務器,然後,我需要從數據庫中檢索它們。我知道在數據庫中,我應該只存儲數據,將實際文件留給文件系統,因此我試圖想出哪一種可能是保存這些數據的最佳方式。Codeigniter:將圖像數據存儲在數據庫中的首選方法

最讓我困擾的是選擇一個命名方案。在數據庫中,我只需要一個filename列,其中只存儲文件名和擴展名。沒有路徑,所以我可以在我的應用程序中配置它。所以:我該用什麼文件名?我想保留一個有意義的名字,所以保留照片標題或至少是其中的一部分會很酷。但要確保哪一個可能是最好的方法的唯一性?

我知道Codeigniter有一個字符串助手,但我也讀了關於使用PHP函數uniqid。然後,我可以將該ID附加到圖片名稱。

你有什麼建議?

+0

是什麼讓你的問題具體到codeigniter?只是問,因爲類似的問題已經在網站上得到冗長的回答,所以如果沒有具體的問題,你可以找到答案。 – hakre

+0

好吧,也許Codeigniter可能有一些庫(我提到的字符串幫手)對這個有用 – Carlo

回答

0

嗯,我更喜歡在圖像的名稱中使用散列,因爲如果有兩個同名的圖像會發生這種情況,並且會產生未來的問題。

另一個提示,從不想將文件的內容存儲在數據庫中,成本遠遠高於只存儲該文件的路徑。

0

將圖像存儲在數據庫中不是一個好主意,而是將指向圖像的鏈接存儲在數據庫中。例如, ; 創建一個表具有以下字段的圖像

  • IMAGE_TYPE //類型的圖像( 「PNG」, 「JPG」, 「GIF」 .....)的

    • image_id //唯一id
    • 圖片鏈接//路徑文件夾,圖像位於圖像的上傳
    • 上傳日期//日期(有用的數據庫查詢訂購)

    您可以添加任何其他領域,你想

  • +0

    我認爲這很明顯,但我從來沒有想過要在數據庫中存儲文件 – Carlo

    +0

    @Carlo我的壞,對於文件名,我想你它應該散列與md5或sha1或uniqid哪個你更喜歡 – MrFoh

    +0

    好,但我想我會失去在URL中顯示照片名稱的可能性 – Carlo

    1

    只要不會有成千上萬的圖像(或者你只是想爲昂貴的SCSI驅動器付費:)),隨意將整個圖像存儲在數據庫中。如果你不確定,文件系統也可以。

    對於圖像的唯一ID,最好的方法可能是使用DB插入ID(保證唯一,無線程/衝突/哭泣)。所以這裏有一個很好的方法,假設你想保持圖像的文件系統:

    create table images (
        image_id int(20) primary key auto_increment, /* assumes mysql */ 
        file_path varchar(2500) not null, /* the actual file name and full path */ 
        file_label varchar(255), /** user's memorable name for the file */ 
        description varchar(2500), /** user provided description of contents */ 
        media_type varchar(100), /** something like image/jpeg; privided by php in upload */ 
    ); 
    

    ,那麼你可能會想image_id用某種分類或標籤,爲user_id的連接等

    編輯

    添加註釋:

    可以使用真正的文件名,如果你喜歡,即使你存儲它們簡單地在文件系統中的圖片ID總是建立鏈接。你只需要利用search friendly urls做這樣的事情(其中1234是圖像ID和/影像/重定向到您的PHP腳本):

    mysite.com/images/db/1234/picture_of_a_cat.jpg) 
    

    然後你只重定向/圖片/ DB /你的PHP腳本。或者,如果您不想嘗試重寫它們,則可以使用$ PATH_INFO。

    例如,如果您有mysite.com/images/render.php/1234/picture_of_cat.jpg:

    <?php 
    $parts = explode("/",$PATH_INFO); 
    $image_id = $parts[3]; 
    $image_from_db = null; //fetch the row from your dabatase here! 
    header("Content-type: ".$image_from_db['media_type']); 
    echo file_get_contents($image_from_db['file_path']); 
    

    祝你好運! ;)

    +0

    好吧,好的,你說的是對的。使用這種方法,當我要在URL中顯示文件名時,我將只是一個隨機ID,同時也可以顯示照片標題 – Carlo

    +0

    感謝您的幫助:)您讓我意識到我可以實現某些像'mysite.com/images/db/1234/picture_of_a_cat.jpg'使用codeigniter路由 – Carlo