node.js - 如何在MongoDB中设置缓冲区偏移范围,它不允许在BSON对象中上传超过16MB的文件?

标签 node.js mongodb express buffer

我的流程和代码:

从表单数据上传图像并将图像的BSON字符串存储到数据库,以下是步骤和代码:

  1. 从 multer upload 上传文件
  2. 从文件系统读取文件 - fs
  3. 将图像内容字符串转换为 Base64 字符串
  4. 将 base64 字符串转换为 BSON 字符串

配置:

node -v: v12.13.1
npm -v: 6.12.1
fs-extra: ^8.1.0
multer: ^1.4.2

代码:

var upload = multer({ 
    storage: multer.diskStorage({
        destination: function (req, file, cb) {
            cb(null, 'uploads')
        },
        filename: function (req, file, cb) {
            cb(null, file.fieldname + '-' + Date.now())
        }
    })
});
upload.single('picture'), (req, res) => {
    
    let imageString = fs.readFileSync(req.file.path);
    let encodeImage = imageString.toString('base64');
    let bufferImage = Buffer.from(encodeImage, 'base64');
    var finalObj = {
        contentType: req.file.mimetype,
        image: bufferImage
    };
    db.collection('filesUpload').insertOne(finalObj, (err, result) => {
        if (err) {
            console.log(err);
        }else{
            console.log('success');
        }
    });

});

什么有效? 我可以成功上传低于 16MB 的图像,并且可以从数据库中正确读取和检索它。

什么不起作用?

我无法上传超过 16MB 的图像。

错误:

RangeError [ERR_OUT_OF_RANGE]: The value of "offset" is out of range. It must be >= 0 && <= 17825792. Received 18646861
at Buffer.write (buffer.js:1019:5)
at serializeObjectId (D:\api\node_modules\mongodb\node_modules\bson\lib\bson\parser\serializer.js:274:14)    at serializeInto (D:\api\node_modules\mongodb\node_modules\bson\lib\bson\parser\serializer.js:935:17)    
at serializeObject (D:\api\node_modules\mongodb\node_modules\bson\lib\bson\parser\serializer.js:347:18)  
at serializeInto (D:\api\node_modules\mongodb\node_modules\bson\lib\bson\parser\serializer.js:727:17)    
at serializeObject (D:\api\node_modules\mongodb\node_modules\bson\lib\bson\parser\serializer.js:347:18)  
at serializeInto (D:\api\node_modules\mongodb\node_modules\bson\lib\bson\parser\serializer.js:941:17)    
at BSON.serialize (D:\api\node_modules\mongodb\node_modules\bson\lib\bson\bson.js:64:28)
at Msg.serializeBson (D:\api\node_modules\mongodb\lib\core\connection\msg.js:126:22)
at Msg.makeDocumentSegment (D:\api\node_modules\mongodb\lib\core\connection\msg.js:118:33)
at Msg.toBin (D:\api\node_modules\mongodb\lib\core\connection\msg.js:104:25)
at serializeCommand (D:\api\node_modules\mongodb\lib\core\connection\pool.js:779:41)
at Pool.write (D:\api\node_modules\mongodb\lib\core\connection\pool.js:927:3)
at _command (D:\api\node_modules\mongodb\lib\core\wireprotocol\command.js:128:10)
at command (D:\api\node_modules\mongodb\lib\core\wireprotocol\command.js:28:5)
at writeCommand (D:\api\node_modules\mongodb\lib\core\wireprotocol\write_command.js:47:3) {
    code: 'ERR_OUT_OF_RANGE'
}

我不知道如何解决这个问题,我认为这是 MongoDB 错误,感谢您的帮助。

最佳答案

这里我使用了称为BSON文档二进制JSON,因此按照MongoDB Docs存储在MongoDB中存在限制。 :

  • BSON 文档最大大小为 16 MB
  • MongoDB 支持 BSON 文档的嵌套不超过 100 层

其他替换方法是什么?

GridFS:

  • 定义:

根据 MongoDB 文档 MongoDB GridFS Docs :

GridFS 是用于存储和检索超过 BSON 文档大小限制 16 MB 的文件的规范。 GridFS 不支持多文档事务。 GridFS 不是将文件存储在单个文档中,而是将文件划分为多个部分或 block ,并将每个 block 存储为单独的文档。

  • API 引用:

如果你需要用 NodeJS 来实现,那么 MongoDB 已经提供了文档,这里是 MongoDB API Reference Docs

  • 堆栈溢出引用:

如果您在实现过程中需要任何帮助,请参阅堆栈溢出帖子,这里是 Stack Overflow Reference

关于node.js - 如何在MongoDB中设置缓冲区偏移范围,它不允许在BSON对象中上传超过16MB的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62129964/

相关文章:

node.js - 使用 body-parser 进行中间件解析的顺序

javascript - 跳过一条路由的 basicAuth

javascript - 数据库数组更新后 ng-repeat 不更新

node.js - 针对竞争条件的 Mongoose 自定义验证功能

javascript - 用于 API 的 NODEJS Express 应用程序生成器

javascript - 我的 React Pagination 工作得很好,但搜索功能却不行?

node.js - 如何在 Sailsjs --no-frontend API 中通过 URL 访问图像

node.js - 无法运行 webdriver 管理器

java - 如何使用distinct/aggregate获取匹配多个查询的所有字段

javascript - 将 JSHint 与 Express.js/'delete' 一起使用(保留字)