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

我试图创build一个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) 

该文件正确生成。 但是,我想避免在服务器上创build一个文件,并将其直接保存在客户端(使用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) 

正如你所看到的,我testing的数据是一个带有特殊字符('ê')的简单string。 我的问题是我无法将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> 

问题不在于从hex转换为十进制,我知道我可以使用Number(116).toString(16)转换回hex。 但是,如何在blob中将这些数据写成二进制文件呢?

好吧,最后事实certificate,我几乎在那里。 为了在Blob中正确保存数据,我需要做的唯一事情就是从服务器获取数据(通过toJSON()方法),然后在保存之前在客户端上创build一个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)