Fondamentalmente voglio trasmettere i dati dalla memoria in un formato tar/gz (possibilmente più file nel tar, ma non dovrebbe MAI TOCCARE L'HARDDRIVE, solo streaming!), Quindi riversarli da qualche altra parte (un Corpo della richiesta HTTP nel mio caso).Ruby streaming tar/gz
Qualcuno sa di una libreria esistente che può fare questo? C'è qualcosa in Rails?
libarchive-ruby è solo un wrapper C e sembra essere molto dipendente dalla piattaforma (i documenti vogliono compilare come una fase di installazione ?!).
SOLUZIONE:
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
Questo è tutto! Puoi scambiare il file in GzipWriter con qualsiasi IO per tenerlo in streaming. Cookie per dw11wtq!
Vorrei anche sottolineare che questo è davvero un uso intensivo della memoria: riempirà lo StringIO con tutto il tar prima di andare al flusso gzip. Una soluzione migliore per i file di grandi dimensioni sarebbe quella di creare un buffer tra i flussi. Aggiungerò il codice per questo quando cerco di implementarlo ... –
Si noti inoltre che gz.close chiuderà anche l'output IO (File in questo caso). Per tenerlo aperto, usa gz.finish –