基本上我想從內存流數據到tar/gz格式(可能有多個文件到tar中,但它不應該接觸HARDDRIVE,只有流!),然後將它們流到其他地方(一個HTTP請求正文在我的情況)。Ruby流tar/gz
任何人都知道現有的庫可以做到這一點? Rails中有什麼嗎?
libarchive-ruby只是一個C包裝,看起來它會非常依賴於平臺(文檔希望您編譯爲安裝步驟?!)。
SOLUTION:
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
這就是它!您可以使用任何IO替換GzipWriter中的文件以保持流式傳輸。 Cookies爲dw11wtq!
我還應該指出,這真的是內存密集型 - 它將在轉到gzip流之前用整個tar填滿StringIO。對於大文件更好的解決方案是在流之間創建緩衝區。當我開始執行它時,我將爲此添加代碼... –
另請注意,gz.close也會關閉輸出IO(本例中爲File)。要保持它打開,請使用gz.finish –