2016-09-16 29 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是什么样的。但这就是你需要插入随机名称逻辑的地方。 –