Ruby 鲁比在溪流中拉拉链

Ruby 鲁比在溪流中拉拉链,ruby,stream,zip,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

我正在尝试编写一个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
块中显示状态消息,也可以使用
read
write
,尽管我还没有测试它们

#! 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格式不可流化,在压缩结束时,它会在文件头中写入一些内容

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

已解决:


我也想知道这一点,zipruby gem非常像Java,而且非常严格。。。我总是会产生外部zip(这是非常强大的,但有点悲哀的事情要做),你是怎么做到的?我试过
IO.popen(“zip-0-r-o-\”{file\u list.join(''''')}\'2>/dev/null”){{f | print f.read(512)}
但是unzip抱怨zip格式无效。tar/gz可能会更吸引人。文件列表错误,引用太多。如果您计划使用ESPACE发送文件,请使用适当的函数对其进行转义(gem“escape”或类似功能,也请检查Ruby 1.9 Shellwords)如果不使用shell cmd,您如何做到这一点?有一个Ruby库,请阅读代码中的示例。问题与从web应用程序中传输zip文件有关。