Ruby 流式传输 tar/gz

标签 ruby stream tar gzip

基本上我想将内存中的数据流式传输为 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 的 cookies !

最佳答案

看看 ruby​​gems 中的 TarWriter 类: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

如果您需要压缩包中的目录布局,它还提供了添加目录的方法。

作为引用,您可以使用 IO.popen 实现 gzip 压缩,只需将数据输入/输出系统进程:

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"

关于Ruby 流式传输 tar/gz,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7856491/

相关文章:

opencv - 捕获 h264 以使用 openCV 进行缓冲

.net - 从Windows SMTP服务读取EML文件。有什么理由不使用StreamReader?

linux - `tar/home/user/file` 是否将/home 所有者更改为 root?

Linux命令从tar中提取单个文件作为字节/字节数组

ruby-on-rails - expect() 在 rspec/cucumber 中做了什么?

ruby-on-rails - ruby 大于符号得到nomethoderror

javascript - 如何使用 DDP 从 Meteor 服务器接收流

java - apache commons 压缩的 Tar 问题

ruby - 为什么我不能用 rbenv 更改我的 ruby​​ 版本?

ruby-on-rails - 如何在功能测试中使用 Rspec 和 Capybara 测试 cookie?