将二进制数据从Nodejs缓冲区写入到流星客户端的blob



我试图创建一个CSV文件,该文件将在服务器上保存UTF-16LE编码,然后将结果传递给客户端。这就是我在Coffeescript中所做的:

Meteor.methods {
    iconv: (data, from="UTF-8", to="UTF-16LE") ->
        Iconv = Meteor.require('iconv').Iconv
        iconv = new Iconv(from, to)
        res = iconv.convert(data) 
        res
}

现在,如果我从服务器写入

fs.writeFileSync('/tmp/test.csv', res)

文件被正确生成。但是,我希望避免在服务器上创建文件,并将其直接保存在客户机上(使用filesaver库)。示例客户端代码如下所示:

exportToCsv = (data="tête", filename) ->
    callback = (err, res) ->
        blob = new Blob([res], {type:'text/csv;charset=UTF-16LE'})
        saveAs(blob, filename)
    Meteor.call('iconv', data, callback)

可以看到,我要测试的数据是一个带有特殊字符('ê')的简单字符串。我的问题是,我不能传递nodejs缓冲区到客户端。它被自动序列化为:

Object {0: 116, 1: 0, 2: 234, 3: 0, 4: 116, 5: 0, 6: 101, 7: 0}

而不是我在服务器上得到的缓冲区输出:

<Buffer 74 00 ea 00 74 00 65 00>

问题不是从十六进制到十进制的转换,我知道我可以用Number(116).toString(16)转换回十六进制。但是我怎么把这些数据写成二进制呢?

好了,最后我发现我就快完成了。我唯一需要做的是将数据正确保存在Blob中,即从服务器(通过toJSON()方法)获取数据作为数字数组,然后在客户端上创建Uint8Array,然后通过Blob将其保存到文件Blob。

那么在服务器端:

Meteor.methods {
    iconv: (data, from="UTF-8", to="UTF-16LE") ->
        Iconv = Meteor.require('iconv').Iconv
        iconv = new Iconv(from, to)
        res = iconv.convert(data) 
        res
}

客户端:

exportToCsv = (data="tête", filename) ->
    callback = (err, res) ->
        byteArray = new Uint8Array(res)
        blob = new Blob([byteArray], {type:'text/csv'})
        saveAs(blob, filename)
    Meteor.call('iconv', data, callback)

相关内容

  • 没有找到相关文章

最新更新