我应该使用 GridFS 还是其他方法来创建文件共享应用程序?

Should I use GridFS or some other method to create a file sharing app?

我目前正在为我的公司开发一个文件共享应用程序。上传文件的简单表格,然后为用户提供下载 URL 并可以将其传递给任何人,以便他们下载文件(类似于 WeTransfer 等产品)。

但是我正在努力决定如何去做。我一直在玩 MongoDB 和 GridFS。我已经成功地使用 multer 和 multer-gridfs-storage 将文件直接上传到我的数据库中。我正在努力让他们下载,因为我对 GridFS 了解不多。

const storage = new GridFsStorage({
url: 'mongodb://localhost:27017/fileUpload',
file: (req, file) => {
    return new Promise((resolve, reject) => {
        crypto.randomBytes(16, (err, buf) => {
            if (err) {
                return reject(err)
            }
            const filename = buf.toString('hex') + path.extname(file.originalname);
            const fileInfo = {
                filename: filename,
                bucketName: 'uploads'
            };
            resolve(fileInfo)
        });
    });
}
}); 

const upload = multer({ storage })

但这让我开始思考这是执行此操作的最佳方式,还是会有更好的原因或提供这些下载文件(下载到用户计算机)。

非常感谢任何建议!

GridFS 是一种用于存储和检索超过 BSON 文档大小限制 16 MB 的文件的规范。 GridFS 是所有 MongoDB 驱动程序实现的约定,它在许多较小的文档中存储二进制数据。二进制文件被分成块,然后块存储在 GridFS 创建的集合中。

话虽如此,鉴于所呈现的用例,我强烈建议在给定的应用程序环境中使用媒体服务器进行存储,这将是一个更经济、可行和可扩展的解决方案。

话虽如此,如果有其他成本更低的存储选项,我通常会避免将 BLOB 放入数据库中,因为使用数据库作为 BLOB 存储通常不是成本优化的解决方案。 当然,在数据库中存储 blob 有正当理由,但考虑到应用程序的用例(媒体密集型),使用媒体服务器存储文件,使用数据库存储数据结构。

在这种情况下,随着时间的推移,通常很容易出现“成本未优化”的情况。此外,数据库大小会随着时间呈指数级增长,给 RAM(WiredTiger 缓存)管理带来挑战。

总而言之 - 如果是我 - 我会为 BLOB 密集型应用程序使用媒体存储,而不是依赖数据库。