node.js - nodejs中的mqtt文件传输?(使用 mqtt.js)
问题描述
对,所以我试图在 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);
解决方案
问题是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% 左右,但仍应小于直接字符串化缓冲区。
推荐阅读
- sql-server - 在现有数据库上恢复(替换)数据库与通过删除 MS SQL Server 中的现有数据库来恢复数据库不同吗?
- javascript - 通过 ctx.drawImage 获取图像并转换为 base64
- arrays - 在 Swift 中读取 JSON 中的嵌套数组和元组
- autofill - PowerApps - 新表单的自动填充日期
- javascript - 如何更改默认值并使用新值?
- kubernetes - Kubernetes NGINX 入口配置映射 301 重定向
- php - CodeIgniter SMTP 给出“读取超时(600 秒)等待数据(CMD_DATA_END)”
- intellij-idea - 在 IntelliJ 快速文档中展开常量
- annotations - 带有事务注释方法的 Mockito
- sql - SQL 删除触发器