Básicamente quiero transmitir datos de la memoria a un formato tar/gz (posiblemente varios archivos en el tar, pero NUNCA TOCAR LA HARDDRIVE, ¡solo la transmisión!), Luego transmitirlos a otro lugar (Cuerpo de solicitud HTTP en mi caso).Ruby streaming tar/gz
¿Alguien sabe de una biblioteca existente que puede hacer esto? ¿Hay algo en Rails?
libarchive-ruby es solo un contenedor C y parece que dependería de la plataforma (¿los documentos quieren que compile como paso de instalación ?!).
SOLUCIÓN:
require 'zlib'
require 'rubygems/package'
tar = StringIO.new
Gem::Package::TarWriter.new(tar) { |writer|
writer.add_file("a_file.txt", 0644) { |f|
(1..1000).each { |i|
f.write("some text\n")
}
}
writer.add_file("another_file.txt", 0644) { |f|
f.write("some more text\n")
}
}
tar.seek(0)
gz = Zlib::GzipWriter.new(File.new('this_is_a_tar_gz.tar.gz', 'wb')) # Make sure you use 'wb' for binary write!
gz.write(tar.read)
tar.close
gz.close
eso es todo! Puede intercambiar el archivo en el GzipWriter con cualquier IO para mantenerlo en línea. ¡Cookies para dw11wtq!
Debo señalar también que esto requiere mucha memoria: llenará el StringIO con todo el alquitrán antes de pasar al flujo de gzip. Una mejor solución para archivos grandes sería crear un búfer entre las secuencias. Agregaré un código para esto cuando lo implemente ... –
También tenga en cuenta que gz.close también cerrará el IO de salida (Archivo en este caso). Para mantenerlo abierto, use gz.finish –