通过ActionCable发送压缩二进制数据

时间:2018-10-02 12:27:21

标签: ruby-on-rails actioncable rails-activejob filesaver.js rubyzip

ActiveJob在Tempfile中生成一个zip文件,将其数据读取到一个变量中,完成作业后,将数据以Base64编码的形式广播到客户端,客户端通过saveAs下载数据

最终结果无法解压缩/损坏。

我怀疑在编码/解码时会丢失某些东西,因为zip创建方法以前曾在控制器中起作用,但由于明显耗时太长而无法在生产中使用,所以我尝试了这种方法,我可以不能正常工作。

工作的相关部分:

...
zip_data = File.read(temp_file.path)
encoded_zip_data = Base64.encode64(zip_data)
ActionCable.server.broadcast(
    "export_channel_#{uuid}", { zip: encoded_zip_data }
)
...

处理接收到的数据的咖啡的相关部分:

...
received: (data) ->
  blob = new Blob([ window.atob data.zip ], {
    type: "application/zip"
  })
  saveAs blob, 'data.zip'
...

1 个答案:

答案 0 :(得分:0)

This解决了。

str2bytes = (str) ->
  bytes = new Uint8Array(str.length)
  i = 0
  while i < str.length
    bytes[i] = str.charCodeAt(i)
    i++
  bytes

在接收函数中添加以上内容并执行此操作

received: (data) ->
  blob = new Blob([ str2bytes(window.atob(data.zip)) ], {
    type: "application/zip"
  })

  saveAs blob, 'data.zip'