使用Express和Mongodb维护上传的图片 - 最佳做法?

时间:2016-09-16 07:54:18

标签: node.js mongodb express

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

我最初的想法是

  1. 将图片上传到具有users-id
  2. 的文件夹中
  3. 在用户db-model
  4. 中将目录链接另存为字符串
  5. 然后在前端将url-strings粘贴到img-src
  6. 这种方法真正让我感到困惑的是,图像基本上需要在两个地方维护(更改图像名称,删除图像,添加图像......),db-model(urls-strings)和upload-folder-structure(路径,图像名称)。使用一组辅助函数可能会使这更容易。

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

2 个答案:

答案 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)