5

zip ファイルであるTempFileオブジェクトがあり、次のように読み取りたいと考えています。

Zip::ZipFile.open_buffer(tempfile) do |zipfile|
    ...
end

ただし、これを行うと、次のエラーが発生します。

Zip::ZipFile.open_buffer expects an argument of class String or IO. Found: Tempfile

私も試してみました

Zip::ZipFile.open(tempfile.path) do |zipfile|
    ...
end

しかし、それは戻ります

can't dup NilClass

一時的な zip ファイルを処理するにはどうすればよいですか?

4

3 に答える 3

3

次の記事http://info.michael-simons.eu/2008/01/21/using-rubyzip-to-create-zip-files-on-the-fly/を参照してください。これは、より基本的なインターフェイス Zip の使用方法を説明しています。 ::Tempfile を使用する場合は ZipOutputStream

于 2012-10-25T20:03:16.013 に答える
2

一時ファイルが破損していることが判明したため、

can't dup NilClass

エラーは、破損したファイルを読み取ろうとした結果として発生しました。

したがって、解決策は使用することです

Zip::ZipFile.open(tempfile.path) do |zipfile|
    ...
end
于 2012-10-26T10:01:03.323 に答える
0

私は同じエラーに直面しましたが、掘り下げた後、これらのzipファイルはバイナリでなければならないことがわかりました

つまり、最初にそれらをバイナリモードでいくつかのファイルにコピーしてから、エラーに直面することなくZIPモジュールを使用して解凍できます

サンプルコード

#copying zip file to a new file in binary mode

filename = "empty.zip" 
File.open(filename, "wb") do |empty_file|
  open("#{zipfile_url}", 'rb') do |read_file|
    empty_file.write(read_file.read)
  end
end

#now you can open the zip file

Zip::File.open(filename) do |f|
  . . .
end
于 2014-04-30T19:03:16.980 に答える