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

Posted

技术标签:

【中文标题】如何在 MongoDB 中设置缓冲区偏移范围,它不允许在 BSON 对象中上传超过 16MB 的文件?【英文标题】:How to set Buffer offset range in MongoDB, Its not allowing to upload more than 16MB file in BSON Object? 【发布时间】:2020-09-19 14:53:44 【问题描述】:

我的流程和代码:

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

    从 multer upload 上传文件 从文件系统读取文件 - fs 将图片内容字符串转换为base64字符串 将 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 错误,感谢您的帮助。

【问题讨论】:

mongo 对对象有 16mb 的限制,docs.mongodb.com/manual/reference/limits/#BSON-Document-Size 感谢@TomSlabbaert 目前有一些实时用户数据,如果我更改此方法将需要很长时间转换,请建议是否有任何替代选项,类似于此选项。 【参考方案1】:

这里我使用了 Binary JSON 称为 BSON 文档,因此根据MongoDB Docs 存储在 MongoDB 中是有限制的:

最大 BSON 文档大小为 16 兆字节 MongoDB 支持不超过 100 级的 BSON 文档嵌套

还有什么替代方法?

GridFS:

定义:

根据 MongoDB 文档MongoDB GridFS Docs:

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

API 参考:

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

堆栈溢出参考:

如果您在实施方面需要任何帮助,请参阅堆栈溢出帖子,这里是 Stack Overflow Reference

【讨论】:

以上是关于如何在 MongoDB 中设置缓冲区偏移范围,它不允许在 BSON 对象中上传超过 16MB 的文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫数据框中设置时间戳的偏移量?

如何在 mongodb 配置文件中设置授权?

如何在 GCP 中设置与 MongoDB Docker 容器的连接

使用'gdb'在函数内的特定偏移量中设置断点

如何在 Spring Boot 中设置副本集?

如何在 TTTAtributedLabel 中设置范围的背景颜色