2016-09-16 28 views
1

我正在開發一項服務(Express,Mongodb),用戶可以在其中的各個位置將圖像上傳到他們的帳戶。在我潛入之前,我想確保我有正確的策略來管理(存儲,編輯,刪除,加載)這些上傳的圖片。使用Express和Mongodb維護已上傳的圖片 - 最佳實踐?

我最初的想法是

  1. 上傳圖片到一個文件夾與用戶-ID
  2. 保存在用戶的目錄鏈接爲串DB-模型
  3. 然後在前端將url字符串粘貼到img-src中

這個方法真的讓我感到困惑的是,基本上需要維護圖像(更改圖像名稱,刪除圖像,添加圖像...)地方,t他db模型(urls字符串)和上傳文件夾結構(路徑,圖像名稱)。使用一組輔助函數可能會使這更容易。

但是,是否還有更好的方式來管理Mongodb和Express圖像?這裏有什麼最佳做法?

+0

你是什麼意思,「維持」?一旦你存儲它,你不需要再次觸摸它。 –

+0

感謝您的反饋。澄清原文中「維護」的含義。 – Seltsam

回答

2

它或多或少像你描述的那樣。您需要在某處存儲映像(本地文件系統或S3,無關緊要),並且您需要在數據庫中有記錄才能引用它。然後以某種方式使用它(呈現爲img src或其他)。所以你必須做這三件事情,沒有辦法繞過它。當然,清潔/更好的代碼會讓你的生活更輕鬆。

但是,我想勸告一件事,但:重命名存儲中的文件。這是脆弱的/容易出錯的。如果重命名失敗了,因爲已經有一個帶有這個名字的文件了?

取而代之的是,用隨機名(sha-1的內容或隨機的uuid或其他東西)存儲所有文件,並將原始文件名存儲在數據庫中(當然還有實際的文件路徑)。這樣,如果您需要它,您將能夠「重新命名」文件而無需觸摸存儲。

+0

這是一個很有價值的提示,一定會這樣做的!謝謝! – Seltsam

+0

雖然試圖實現它似乎更令人費解。 現在還有一件事要保持同步:存儲實際文件名(隨機字符串)和分配的虛擬名稱的寄存器。不要這些查找也需要很多性能?我覺得現在我會擺脫重命名功能,所以我只能保留一個文件名。 – Seltsam

+0

@Seltsam:好的,這取決於。如果你不需要原始文件名,那麼顯然你不需要保留它。但通常,存儲文件路徑並不複雜。這只是同一模型中的另一列/字段。例如,「image_url」和「image_original_filename」。這樣,就沒有「保持同步」。由於它們是同一個對象上的字段,因此它們引用同一個文件。 –

0

@Sergio這就是我現在接觸它的方式。你將如何工作在隨機文件名的功能?謝謝

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var ImageSchema = new Schema({ 
    name: String, 
    _id:false 
}) 

ImageSchema.virtual('url').get(function() { 
    var parent = this.parent() 
    var root = (parent.parent ? parent.parent() : parent) 
    return root.category + "/" + root.path +"/"+ this.name 
}); 

ImageSchema.set('toJSON', { 
    virtuals: true 
}); 

var CombinationSchema = new Schema({ 
    name: String, 
    description: String, 
    images: [ImageSchema], 
    _id:false 
}) 

var CasinoSchema = new Schema({ 
    name: String, 
    category: { 
     type: String, 
     default: 'casino' 
    }, 
    images: [ImageSchema], 
    path: String, 
    description: String, 
    combinations: [CombinationSchema] 
}) 

module.exports = mongoose.model('casinos', CasinoSchema) 
+0

我不知道node.js/express,所以不知道它的文件上傳api是什麼樣的。但這就是你需要插入隨機名稱邏輯的地方。 –