【问题标题】:Whats the best way to save files on backend with mongoDB?使用 mongoDB 在后端保存文件的最佳方法是什么?
【发布时间】:2018-02-20 15:45:08
【问题描述】:

我正在编写一个平均堆栈应用程序,我是一名初学者。

用户必须能够从表单字段中提交一些字符串以及可以是图像或 pdf 的文件。

我看过 Multer,然后我可以将文件的路径与表单数据一起存储在 MongoDB 中。

我还在 GridFS 上找到了一些东西。

完成这项工作的最佳和最简单的方法是什么?

【问题讨论】:

  • 我试过 Multer,我认为这正是您所需要的。它易于使用,具有良好的文档和大量“如何在服务器上上传文件”教程

标签: node.js mongodb express mean-stack


【解决方案1】:

像往常一样:这取决于....

在我正在进行的一个项目中,我们特意选择使用数据库来存储文件。原因之一是通过引入文件管理要求来防止解决方案的另一个安全和配置工件。

现在,请注意,在磁盘上存储文件比在数据库中存储文件要快。但如果性能不是一个真正的大问题,那么将其存储在 MongoDB 中也是一个非常有效的选择(毕竟,它是一个使用二进制序列化作为其核心组件之一的 NoSQL 解决方案)。
您可以选择存储普通集合之一或 GridFS 中的文件。

根据经验:如果您的解决方案中的文件不超过 16MB,那么您可以将它们保存为普通集合中的文档(的一部分)。如果它们大于 16 MB,最好将它们保存在 GridFS 中。
但是,当保存在 GridFS 中时,您必须使用块大小来找到最佳性能。

可以在here找到一篇关于 GridFS 的博文

过去,我在另一个答案中发布了一些关于二进制与基于字符串的序列化以及 GridFS 的使用here
注意:该帖子是用 C# 编写的,但这不应该真的构成问题。

希望这会有所帮助,并祝您在磨练您的程序员技能方面好运。最好的学习方式是询问和实验(很多)。

【讨论】:

    【解决方案2】:

    出于显而易见的原因,您永远不会希望将文件作为二进制数据保存在数据库中,因此如果您想将文件存储在运行应用程序的本地存储中,那么 multer 就是您需要的包。

    var path = require('path')
    var multer = require('multer')
    
    var storage = multer.diskStorage({
        destination: function(req, file, callback) {
            callback(null, './uploads')
        },
        filename: function(req, file, callback) {
            console.log(file)
            callback(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname))
        }
    })
    
    app.post('/api/file', function(req, res) {
        var upload = multer({
            storage: storage
        }).single('userFile')
        upload(req, res, function(err) {
            res.end('File is uploaded')
        })
    })
    

    您可以根据自己的要求和所需的命名约定更改代码位。我建议您保留可预测的文件名,这样您甚至不需要将路径存储在 DB 中,即用户 ID 5 的文件将存储在 /img/user/profile/5.jpg 或类似的位置。

    如果文件过多,您也可以尝试将文件存储在 aws s3 或 google 存储等云存储上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多