1

文字列にzipアーカイブがありますが、rubyzipgemがファイルからの入力を必要としているようです。私が思いついた最善の方法は、ファイル名をに渡すことだけを目的として、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

もっと簡単な方法はありますか?

注:RubyUnzipStringも参照してください。

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を紹介しました(rubyzip 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 に答える