Ruby压缩流

时间:2011-07-14 21:39:24

标签: ruby stream zip

我正在尝试编写一个ruby fcgi脚本,该脚本动态压缩目录中的文件,并将输出作为http响应按块发送。非常重要的是,此压缩是作为流操作完成的,否则客户端将为大型目录获取超时。

我有以下代码:

d="/tmp/delivery/"

# send zip header
header(MimeTypes::ZIP)

# pseudocode from here on
IO.open(d) { |fh|
    block=fh.readblock(1024)
    #send zipped block as http response
    print zip_it(block)
}

如何在上面的列表中实现我所写的伪红宝石?

3 个答案:

答案 0 :(得分:1)

Tokland使用外部zip命令的想法效果很好。这是一个快速的代码片段,可以在Linux或类似环境中使用Ruby 1.9。它使用数组参数popen()来避免任何shell引用问题,并使用sysread / syswrite来避免缓冲。如果您愿意,可以在空rescue块中显示状态消息 - 或者您可以使用readwrite,但我尚未对其进行测试。

#! usr/bin/env ruby
d = '/tmp/delivery'
output = $stdout
IO.popen(['/usr/bin/zip', '-', d]) do |zip_output|
  begin
    while buf = zip_output.sysread(1024)
      output.syswrite(buf)
    end
    rescue EOFError
  end
end

答案 1 :(得分:1)

AFAYK Zip格式不可流式处理,在压缩结束时,它会在文件头中写入内容。

gz或tar.gz是更好的选择。

答案 2 :(得分:0)