Ruby压缩一个流



我正在尝试编写一个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)
}

我如何实现上面清单中我写的伪ruby ?

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

AFAYK Zip格式是不可流式传输的,在压缩结束时它会在文件头中写入一些内容。

solved:

https://github.com/fringd/zipline.git

相关内容

  • 没有找到相关文章

最新更新