对,所以我试图在Node.js中使用mqtt传输一些文件。 如果文件很小,则可以正常工作,但是当大小为6 mb的rar文件变成字符串或缓冲区时,它会变成21 MB。
我需要提供有关文件的一些详细信息,例如路径和文件名,因此我创建了一个包含文件缓冲区和所需数据的对象。一旦有了它,我就可以用JSON对其进行字符串化并发送。
确保为mqtt传输获取适当缓冲区大小的最佳方法是什么?
先谢谢了。 托马斯
var mqtt = require('mqtt');
var fs = require('fs');
let client
let message
let bufferMessage
let data
function genPayload() {
data = fs.readFileSync('app.rar');
let message = {
"filename": "app.rar",
"filePath": "C:\\test\\",
"data": data
}
console.log('Preparing File')
bufferMessage = JSON.stringify(message);
}
function Connect() {
client = mqtt.connect("mqtt://test.mosquitto.org", {
clientId: "vfs001"
});
client.on('connect', function () {
console.log('Client Connected')
});
}
function SendFile() {
client.publish('TestReplFile', bufferMessage)
console.log('File is on the way')
};
genPayload();
Connect();
setTimeout(SendFile, 5000);
答案 0 :(得分:2)
问题是fs.readfileSync()
将返回一个Buffer,当您对其进行字符串化时,它将生成如下内容:
...
data: [ 0x11, 0x44, 0xcf, ... ]
...
文件中的每个字节至少导致4个字符。
要获得二进制文件的最小JSON安全表示,您可能希望对它进行base64编码。
function genPayload() {
data = fs.readFileSync('app.rar');
let message = {
"filename": "app.rar",
"filePath": "C:\\test\\",
"data": data.toString('base64')
}
console.log('Preparing File')
bufferMessage = JSON.stringify(message);
}
Base64仍将比输入文件大30%,但它应比直串缓冲区更小。