MQTT передача файлов в nodejs ?? (используя mqtt.js) - PullRequest
1 голос
/ 29 апреля 2019

Правильно, поэтому я пытаюсь передать некоторые файлы, используя mqtt в nodejs. Это прекрасно работает, если файл крошечный, но что-то маленькое, 6 МБ rar-файла становится 21 МБ, когда он превращается в строку или буфер.

Мне нужно иметь некоторые детали с файлом, такие как путь и имя файла, поэтому я создал объект, который содержит буфер файла и данные, которые мне нужны. Как только я получу это, я его Stringify с помощью 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);

1 Ответ

2 голосов
/ 29 апреля 2019

Проблема в том, что 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% больше, чем входной файл, но он все равно должен быть меньше, чем буфер с прямой строкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...