1

我有一个字符串中的 zip 存档,但 ruby​​zip gem 似乎需要从文件中输入。我想出的最好的方法是将 zip 存档写入临时文件,其唯一目的是将文件名传递给Zip::ZipFile.foreach(),但这似乎很折磨:

require 'zip/zip'
def unzip(page)
  "".tap do |str|
    Tempfile.open("unzip") do |tmpfile|
      tmpfile.write(page)
      Zip::ZipFile.foreach(tmpfile.path()) do |zip_entry|
        zip_entry.get_input_stream {|io| str << io.read}
      end
    end
  end
end

有没有更简单的方法?

注意:另请参阅Ruby 解压缩字符串

4

3 回答 3

4

请参阅Zip/RubyZip::Archive.open_buffer(...)

require 'zipruby'
Zip::Archive.open_buffer(str) do |archive|
  archive.each do |entry|
    entry.name
    entry.read
  end
end
于 2013-02-15T07:21:46.290 回答
0

@maerics 的回答向我介绍了 zipruby gem(不要与 ruby​​zip gem 混淆)。它运作良好。我的完整代码最终是这样的:

require 'zipruby'

# Given a string in zip format, return a hash where 
# each key is an zip archive entry name and  each
# value is the un-zipped contents of the entry
def unzip(zipfile)
  {}.tap do |entries|
    Zip::Archive.open_buffer(zipfile) do |archive|
      archive.each do |entry|
        entries[entry.name] = entry.read
      end
    end
  end
end
于 2013-02-16T16:02:51.020 回答
-1

Ruby 的StringIO在这种情况下会有所帮助。

将其视为一个字符串/缓冲区,您可以将其视为内存文件。

于 2013-02-15T10:14:51.233 回答