【发布时间】:2025-11-26 18:05:02
【问题描述】:
基本上,我想将内存中的数据流式传输到 tar/gz 格式(可能将多个文件放入 tar,但它永远不会触及硬盘,只能流式传输!),然后将它们流式传输到其他地方(我的 HTTP 请求正文案例)。
有人知道可以做到这一点的现有图书馆吗? Rails 中有什么东西吗?
libarchive-ruby 只是一个 C 包装器,并且似乎非常依赖于平台(文档希望您作为安装步骤进行编译?!)。
解决方案:
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 中的文件以保持其流式传输。 dw11wtq 的 Cookie!
【问题讨论】:
-
我还应该指出,这确实是内存密集型的——它会在进入 gzip 流之前用整个 tar 填充 StringIO。对于大文件,更好的解决方案是在流之间创建一个缓冲区。当我开始实现它时,我会为此添加代码......
-
还要注意 gz.close 也会关闭输出 IO(本例中是文件)。要保持打开状态,请使用 gz.finish