如何在 MongoDB 中设置缓冲区偏移范围,不允许在 BSON 对象中上传超过 16MB 的文件?
How to set Buffer offset range in MongoDB, Its not allowing to upload more than 16MB file in BSON Object?
我的流程和代码:
从Form Data上传图片并将图片的BSON字符串存入数据库,步骤和代码如下:
- 正在从多个上传中上传文件
- 正在从文件系统读取文件 - 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 错误,感谢您的帮助。
这里我使用了二进制JSON调用BSON文档,所以存储在[=60=中是有限制的] 根据 MongoDB Docs:
- 最大 BSON 文档大小为 16 兆字节
- MongoDB 支持 BSON 文档不超过 100 层嵌套
还有什么替换方法?
网格文件系统:
- 定义:
根据 MongoDB 文档 MongoDB GridFS Docs:
GridFS 是一种用于存储和检索超过 BSON 文档大小限制 16 MB 的文件的规范。 GridFS 不支持多文档事务。 GridFS 不是将文件存储在单个文档中,而是将文件分成多个部分或块,并将每个块存储为一个单独的文档。
- API参考:
如果你需要用NodeJS来实现,那么MongoDB已经提供了文档,这里是MongoDB API Reference Docs
- 堆栈溢出参考:
如果您在实现方面需要任何帮助,请参考堆栈溢出 post,这里是 Stack Overflow Reference
我的流程和代码:
从Form Data上传图片并将图片的BSON字符串存入数据库,步骤和代码如下:
- 正在从多个上传中上传文件
- 正在从文件系统读取文件 - 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 错误,感谢您的帮助。
这里我使用了二进制JSON调用BSON文档,所以存储在[=60=中是有限制的] 根据 MongoDB Docs:
- 最大 BSON 文档大小为 16 兆字节
- MongoDB 支持 BSON 文档不超过 100 层嵌套
还有什么替换方法?
网格文件系统:
- 定义:
根据 MongoDB 文档 MongoDB GridFS Docs:
GridFS 是一种用于存储和检索超过 BSON 文档大小限制 16 MB 的文件的规范。 GridFS 不支持多文档事务。 GridFS 不是将文件存储在单个文档中,而是将文件分成多个部分或块,并将每个块存储为一个单独的文档。
- API参考:
如果你需要用NodeJS来实现,那么MongoDB已经提供了文档,这里是MongoDB API Reference Docs
- 堆栈溢出参考:
如果您在实现方面需要任何帮助,请参考堆栈溢出 post,这里是 Stack Overflow Reference