2

我目前正在为我的公司开发一个文件共享应用程序。上传文件的简单表单,然后用户会获得一个下载 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 })

但这让我想到这是这样做的最佳方式,还是会有更好的原因或提供这些下载文件(下载到用户计算机)。

任何意见是极大的赞赏!

4

1 回答 1

1

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

话虽如此,鉴于所提供的用例,我强烈建议在给定应用程序环境的情况下使用媒体服务器进行存储,这使得解决方案更加经济、可行和可扩展。

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

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

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

于 2022-02-11T17:56:28.783 回答