Tuve un problema similar que resolví utilizando la gema rubyzip y el objeto stringio. Resulta que rubyzip proporciona un método que devuelve un objeto de cadena: ZipOutputStream.write_buffer
.
Puede crear la estructura de archivos zip como desee usando put_next_entry
y escribir, y una vez que haya terminado puede rebobinar la cadena y leer los datos binarios usando sysread.
Vea el siguiente ejemplo simple (funciona para 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
probado en jruby 1.6.5.1 (rubí-1.9.2-p136) (2011-12-27 1bf37c2) (Java HotSpot (TM) de 64 bits del servidor VM 1.6.0_29) [Windows Server 2008 amd64 java])
el siguiente ejemplo se trabaja para 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
Probado en jruby 1.7.22 (1.9.3p551) 20/08/2015 c28f492 en OpenJDK 64- Bit Server VM 1.7.0_79-b14 + jit [linux-amd64] y rubyzip gem 1.1.7
Ver [la respuesta de @vas] (http://stackoverflow.com/a/9712252/244128), ¡hace exactamente lo que quieres! – maerics