使用Express和Mongodb维护上传的图片 – 最佳实践?

我正在开发一个servlets(Express,Mongodb),用户可以在其中将图像上传到他们的账户。 在我潜入之前,我想确保我有正确的策略来pipe理(存储,编辑,删除,加载)这些上传的图片。

我最初的想法是

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

这个方法真的让我感到困惑,因为基本上需要在两个地方维护图像(更改图像名称,删除图像,添加图像…),数据库模型(url-string)和上传 – 文件夹结构(path,图像名称)。 使用一组辅助函数可能会使这个变得更容易。

但是,还有,用Mongodb和Expresspipe理图像的更优雅的方法是什么? 这里有最佳做法吗?

这或多或less像你所描述的。 您需要将图像存储在某处(本地文件系统或S3,无关紧要),您需要在数据库中创build一个logging来引用它。 然后以某种方式使用它(呈现为img src或其他)。 所以你不得不做这三件事,没办法。 当然,更清洁/更好的代码将使您的生活更轻松。

我想build议一件事,虽然:重命名存储中的文件。 这是脆弱的/容易出错的。 如果重命名失败了,因为已经有这个名字的文件了?

而是用随机名(sha-1的内容或随机的uuid或其他)存储所有文件,并将原始文件名存储在数据库中(当然还有实际的文件path)。 这样,如果你需要它,你将能够“重命名”文件,而不必接触存储。

@Sergio这就是我现在接触它的方式。 你将如何工作的随机文件名的function? 谢谢

 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)