我正在开发一项小型服务(Express,Mongodb),用户可以将图像上传到各个地方的帐户。在我潜入之前,我想确保我有正确的策略来管理(存储,编辑,删除,加载)这些上传的图片。
我最初的想法是
这种方法真正让我感到困惑的是,图像基本上需要在两个地方维护(更改图像名称,删除图像,添加图像......),db-model(urls-strings)和upload-folder-structure(路径,图像名称)。使用一组辅助函数可能会使这更容易。
但是,有没有更优雅的方式来管理Mongodb和Express的图像?这里有什么最好的做法?
答案 0 :(得分:2)
它或多或少与你描述的一样。您需要在某处存储图像(本地文件系统或S3,无关紧要),并且您需要在数据库中使用记录来引用它。然后以某种方式使用它(渲染为img src或其他)。所以你将必须做这三件事,不管怎样。当然,更清洁/更好的代码将使您的生活更轻松。
我想建议反对一件事:重命名存储中的文件。这很脆弱/容易出错。如果重命名失败,因为已经存在具有此名称的文件,该怎么办?
相反,存储所有具有随机名称(sha-1内容或随机uuid或其他内容)的文件,并将原始文件名存储在数据库中(当然还有实际的文件路径)。这样,如果您需要它,您将能够重命名"文件没有触及存储空间。
答案 1 :(得分: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)