【问题标题】:Maintain uploaded Pictures with Express and Mongodb - Best practise?使用 Express 和 Mongodb 维护上传的图片 - 最佳实践?
【发布时间】:2016-09-16 07:54:18
【问题描述】:

我正在开发一项小服务(Express、Mongodb),用户可以在其中将图像上传到他们在不同地方的帐户。在开始之前,我想确保我有正确的策略来管理(存储、编辑、删除、加载)这些上传的图片。

我最初的想法是

  1. 将图片上传到带有 users-id 的文件夹中
  2. 将目录链接保存为用户数据库模型中的字符串
  3. 然后在前端将 url-strings 粘贴到 img-src 中

这种方法真正困扰我的是,图像基本上需要在两个地方进行维护(更改图像名称、删除图像、添加图像……),db-model(urls-strings)和上传文件夹结构(路径、图像名称)。使用一组辅助函数可能会更容易。

但是,有没有更优雅的方式来使用 Mongodb 和 Express 管理图像?这里有什么最佳做法吗?

【问题讨论】:

  • “维护”是什么意思?存放后,无需再次触摸。
  • 感谢您的反馈。澄清了我在原帖中所说的“维护”的意思。

标签: node.js mongodb express


【解决方案1】:

和你描述的差不多。您需要将图像存储在某处(本地文件系统或 S3,无关紧要),并且您需要在数据库中记录来引用它。然后以某种方式使用它(呈现为 img src 或其他)。所以你必须做这三件事,没有办法。当然,更简洁/更好的代码会让你的生活更轻松。

不过,我想建议不要做一件事:重命名存储中的文件。那是脆弱的/容易出错的。如果重命名失败,因为已经有一个同名的文件?

相反,使用随机名称(内容的 sha-1 或随机 uuid 或其他名称)存储所有文件,并将原始文件名存储在您的数据库中(当然还有实际的文件路径)。这样,如果您需要它,您将能够“重命名”文件而无需触及存储空间。

【讨论】:

  • 这是一个有价值的提示,一定会这样做!谢谢!
  • 在尝试实现它时,它似乎更加复杂。现在还有一件事要保持同步:存储实际文件名(随机字符串)和分配的虚拟名称的寄存器。这些查找不也会消耗大量性能吗?我觉得我现在会摆脱重命名功能,这样我就可以只保留一个文件名了。
  • @Seltsam:好吧,这取决于。如果您不需要原始文件名,那么显然您不需要保留它。但一般来说,存储文件路径并不复杂。它只是同一模型中的另一列/字段。例如image_urlimage_original_filename。这样,就没有“保持同步”了。由于它们是同一个对象上的字段,因此它们引用同一个文件。
【解决方案2】:

@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)

【讨论】:

  • 我不知道node.js/express,所以不知道它的文件上传api是什么样的。但这就是您需要插入随机名称逻辑的地方。
猜你喜欢
  • 2018-08-26
  • 1970-01-01
  • 2019-03-04
  • 2011-08-04
  • 2023-03-12
  • 2017-12-22
  • 2010-09-25
  • 1970-01-01
相关资源
最近更新 更多