Ruby ZIP кодировка файла для отправки в Sidekiq / Redis - PullRequest
0 голосов
/ 12 октября 2019

Я создаю ZIP-файл, используя следующий код:

def compress_batch(directory_path)
  zip_file_path = File.join( File.expand_path("..", directory_path), SecureRandom.hex(10))
  Zip::File.open(zip_file_path, Zip::File::CREATE) do |zip_file|
    (Dir.entries(directory_path) - %w(. ..)).each do |file_name|
      zip_file.add file_name, File.join(directory_path, file_name)
    end
  end

  result = File.open(zip_file_path, 'rb').read
  File.unlink(zip_file_path)
  result
end

Я сохраняю этот ZIP-файл в памяти:

@result = Payoff::DataFeed::Compress::ZipCompress.new.compress_batch(source_path)

Я помещаю его в хеш:

options = {
  data: @result
}

Затем я отправляю его своему работнику SideKiq, используя perform_async:

DeliveryWorker.perform_async(options)

и получаю следующую ошибку:

[DEBUG]   Starting store to: { "destination" => "sftp", "path" => "INBOUND/20191009.zip" }
Encoding::UndefinedConversionError: "\xBA" from ASCII-8BIT to UTF-8
from ruby/2.3.0/gems/activesupport-4.2.10/lib/active_support/core_ext/object/json.rb:34:in `encode'

Однако, если я использую .new.performвместо .perform_async, в обход SideKiq, он работает отлично!

DeliveryWorker.new.perform(options)

Мое лучшее предположение - что-то не так с моей кодировкой, так что, когда задание переходит к SideKiq / Redis, оно взрывается. Как я должен был закодировать это? Нужно ли мне изменить создание моего файла ZIP? Может быть, я смогу преобразовать кодировку при подаче в SideKiq?

1 Ответ

2 голосов
/ 12 октября 2019

Sidekiq сериализует аргументы как JSON. Вы пытаетесь вставить двоичные данные в JSON, который поддерживает только строки UTF-8. Вам нужно будет кодировать данные Base64, если вы хотите передать их через Redis.

require 'base64'

encoded = Base64.encode64(filedata)
...