13

単体テストを作成していますが、そのうちの 1 つが zip ファイルを返しています。この zip ファイルの内容を確認し、そこからいくつかの値を取得して、値を次のテストに渡したいと考えています。

Rack Test を使用しているので、zip ファイルの内容がlast_response.body. RubyZipのドキュメントを調べましたが、常にファイルが必要なようです。単体テストを実行しているので、可能であればテスト zip ファイルでフォルダーを汚染しないように、すべてをメモリ内で実行することを好みます。

4

8 に答える 8

8

新しい RubyZip API を使用したこの回答の最新バージョンについては、@bronson の回答を参照してください。

リンクした Rubyzip ドキュメントは少し古くなっています。最新のリリース (0.9.9)ではIOオブジェクトを処理できるため、StringIO を使用できます (少し調整してください)。

API は を受け入れますがIO、それがファイルであると想定して呼び出しを試みているように見えるpathため、最初にモンキー パッチを適用StringIOしてメソッドを追加しpathます (実際には何もする必要はありません)。

require 'stringio'
class StringIO
  def path
  end
end

次に、次のようなことができます。

require 'zip/zip'
Zip::ZipInputStream.open_buffer(StringIO.new(last_response.body)) do |io|
  while (entry = io.get_next_entry)
    # deal with your zip contents here, e.g.
    puts "Contents of #{entry.name}: '#{io.read}'"
  end
end

すべてがメモリ内で行われます。

于 2012-12-05T21:23:31.027 に答える
4

RubyZipバージョン(または以前1.2.1のバージョンも) では、クラスopen_bufferのメソッドを使用するだけです。Zip::File

RubyZip のドキュメントから:

#open と似ていますが、文字列またはオープン IO ストリームから zip アーカイブの内容を読み取り、データをバッファーに出力します。(これは、最初にディスクに保存せずに、ダウンロードした zip アーカイブからデータを抽出するために使用できます。)

例:

Zip::File.open_buffer(last_response.body) do |zip|
  zip.each do |entry|
    puts entry.name
    # Do whatever you want with the content files.
  end
end
于 2017-04-09T05:00:04.350 に答える
1

Tempfilezipファイルを一時ファイルにダンプするために使用できます。Tempfileは、プログラムの終了後にOSによってクリーンアップされるオペレーティングシステム固有の一時ファイルを作成します。

于 2012-12-05T19:49:36.270 に答える
0

rubyzip での変更による、これに関する更新のみ:

Zip::InputStream.open(StringIO.new(zip_file)) do |io|
  while (entry = io.get_next_entry)
    # deal with your zip contents here, e.g.
    puts "Contents of #{entry.name}: '#{io.read}'"
  end
end
于 2014-05-27T00:27:05.640 に答える