Отправка двоичных данных в формате ZIP через ActionCable - PullRequest
0 голосов
/ 02 октября 2018

ActiveJob генерирует zip-файл в Tempfile, считывает его данные в переменную, по завершении задания передает данные в кодировке 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 голосов
/ 02 октября 2018

Это решило это.

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'
...