Ruby的StringIO在这种情况下会有所帮助。
我在字符串中有一个zip存档,但rubyzip-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解压缩字符串。
请参阅Zip/Rube Zip::Archive.open_buffer(...)
:
require 'zipruby'
Zip::Archive.open_buffer(str) do |archive|
archive.each do |entry|
entry.name
entry.read
end
end
@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
把它想象成一个字符串/缓冲区,你可以把它当作内存中的文件。