У меня была похожая проблема, которую я решил с помощью гема rubyzip и объекта stringio.
Оказывается, что rubyzip предоставляет метод, который возвращает объект stringio: ZipOutputStream.write_buffer
.
Вы можете создать структуру zip-файла по своему усмотрению, используя put_next_entry
и писать, и как только вы закончите, вы можете перемотать stringio и прочитать двоичные данные, используя sysread.
См. Следующий простой пример (работает для rubyzip 0.9.X)
require 'zip/zip'
stringio = Zip::OutputStream.write_buffer do |zio|
zio.put_next_entry("test.txt")
zio.write "Hello world!"
end
stringio.rewind
binary_data = stringio.sysread
Протестировано на jruby 1.6.5.1 (ruby-1.9.2-p136) (2011-12-27 1bf37c2) (64-разрядный сервер Java HotSpot (TM), виртуальная машина 1.6.0_29) [Windows Server 2008-amd64-java] ) * +1010 *
Следующий пример работает для rubyzip> = 1.0.0
require 'rubygems'
require 'zip'
stringio = Zip::OutputStream.write_buffer do |zio|
zio.put_next_entry("test.txt")
zio.write "Hello world!"
end
binary_data = stringio.string
Протестировано на jruby 1.7.22 (1.9.3p551) 2015-08-20 c28f492 на 64-битном сервере OpenJDK VM 1.7.0_79-b14 + jit [linux-amd64] и rubyzip gem 1.1.7