seb*_*seb 1 javascript blob binary-data node.js meteor
我正在尝试创建一个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
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我用服务器从服务器写入文件
fs.writeFileSync('/tmp/test.csv', res)
Run Code Online (Sandbox Code Playgroud)
文件正确生成.但是,我想避免在服务器上创建文件并将其直接保存在客户端上(使用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)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我正在测试的数据是一个带有特殊字符的简单字符串('ê').我的问题是我无法将nodejs缓冲区传递给客户端.它会自动序列化为:
Object {0: 116, 1: 0, 2: 234, 3: 0, 4: 116, 5: 0, 6: 101, 7: 0}
Run Code Online (Sandbox Code Playgroud)
而不是我在服务器上获得的缓冲区输出:
<Buffer 74 00 ea 00 74 00 65 00>
Run Code Online (Sandbox Code Playgroud)
问题不在于从十六进制到十进制的转换,我知道我可以使用某些东西转换回十六进制Number(116).toString(16).但是如何在blob中将此数据写为二进制?
好吧,所以最后我发现我几乎就在那里.我需要做的唯一一件事就是在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
}
Run Code Online (Sandbox Code Playgroud)
在客户端:
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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3108 次 |
| 最近记录: |