nodejs中的mqtt文件传输?? (使用mqtt.js)

问题描述 投票:1回答:1

是的,所以我试图在nodejs中使用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);
node.js mqtt
1个回答
2
投票

问题是fs.readfileSync()将返回一个缓冲区,当你进行字符串化时,它会产生一些看起来像这样的东西:

...
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%,但它应该比直接字符串化缓冲区小。

© www.soinside.com 2019 - 2024. All rights reserved.