基本上我想将内存中的数据流式传输为 tar/gz 格式(可能将多个文件传输到 tar 中,但它永远不应该接触硬盘,只能流式传输!),然后将它们流式传输到其他地方(在我的例子中是 HTTP 请求体)。
有人知道现有的图书馆可以做到这一点吗? Rails 中有什么东西吗?
libarchive-ruby http://rubydoc.info/gems/libarchive-ruby/0.0.3/frames只是一个 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 的饼干!
看一下 rubygems 中的 TarWriter 类:http://rubygems.rubyforge.org/rubygems-update/Gem/Package/TarWriter.html http://rubygems.rubyforge.org/rubygems-update/Gem/Package/TarWriter.html它只是对 IO 流进行操作,该流可能是 StringIO。
tar = StringIO.new
Gem::Package::TarWriter.new(tar) do |writer|
writer.add_file("hello_world.txt", 0644) { |f| f.write("Hello world!\n") }
end
tar.seek(0)
p tar.read #=> mostly padding, but a tar nonetheless
如果您需要 tarball 中的目录布局,它还提供了添加目录的方法。
作为参考,您可以通过以下方式实现 gzippingIO.popen
,只是通过管道将数据输入/输出系统进程:
http://www.ruby-doc.org/core-1.9.2/IO.html#method-c-popen http://www.ruby-doc.org/core-1.9.2/IO.html#method-c-popen
gzip 压缩本身看起来像这样:
gzippped_data = IO.popen("gzip", "w+") do |gzip|
gzip.puts "Hello world!"
gzip.close_write
gzip.read
end
# => "\u001F\x8B\b\u0000\xFD\u001D\xA2N\u0000\u0003\xF3H\xCD\xC9\xC9W(\xCF/\xCAIQ\xE4\u0002\u0000A䩲\r\u0000\u0000\u0000"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)