为二进制消息提供类似JSON的类型以用于识别目的

时间:2013-08-13 16:36:23

标签: javascript json html5 node.js binary

有没有办法通过用某种类型属性标记来识别来自服务器的二进制消息?

背景:我正在使用node.js,我正在向客户端发送二进制消息。目前这些只是作为blob发送的图片。因此,在客户端,我正在测试带有Blob实例的传入消息,然后对图片做一些事情。

但是现在我还想通过websocket协议发送其他文件,如.txt(用于下载)。我觉得这比HTTP请求等简单得多。但是现在我必须对传入的二进制消息做出改变,如果它们是图像或文本文件或者某些文件。其他

Chrome Developertools向我显示我的传入图像(blob)具有一个空字符串的type属性。当我读到这个属性是只读的,所以我正在寻找一个解决方案来识别我的二进制消息,就像我可以使用JSON对象...

提前感谢每个想法:)

编辑:

以下是将图像发送到客户端的一个示例。我正在为nodejs使用“ws”模块。

fs.readFile(path, function (err, data)
{
    if (!err)
    {
        connection.send(data, {binary: true}, function(err)
        {
            if (!err) console.log("Server finished sending image to client.");
            else console.log("Error while sending imageto client.");
        });
    }
    else console.log("Error while loading image");
});

我在哪里可以为二进制数据添加某种元数据?我不可能使用Base64编码。

1 个答案:

答案 0 :(得分:0)

如果仅与格式有关,您可以使用content-type标头指定它的文件类型:text/plainimage/png或您想要使用的任何内容......

当然,您可以扩展这个想法并使用自定义标头来传输您想要传输的任何信息。

或者,这是最灵活的解决方案:发回一个真正的JSON对象,嵌入您需要的所有元数据,并提供在JSON中编码的二进制内容(使用您喜欢的任何编码并且与JSON兼容,例如Base64),例如:

{
  "filename": "foo.txt",
  "content-type": "image/png",
  "binary-data": "A5EBC7FFEFDCD8975BC3..."
}

要使用您的代码段作为基础,您可以按如下方式实现它:

fs.readFile(path, function (err, data) {
    if (err) { throw err; }
    connection.send({
        filename: 'foo.txt',
        contentType: 'image/png',
        data: JSON.stringify(data)
    }, { binary: false }, function (err) {
        if (err) { throw err; }
        console.log('Server finished sending image to client.');
    });
});

请注意,我没有测试代码,但您的最终代码应该与此类似。

希望这有帮助。