我有一个TempFile
对象是一个zip文件,我想从中读取如下:
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文件?
答案 0 :(得分:3)
请参阅以下文章http://info.michael-simons.eu/2008/01/21/using-rubyzip-to-create-zip-files-on-the-fly/,其中介绍了如何使用更基本的接口Zip :: ZipOutputStream(如果使用Tempfile
)答案 1 :(得分:2)
事实证明临时文件已损坏,所以
can't dup NilClass
错误是因为尝试读取损坏的文件。
因此解决方案是使用
Zip::ZipFile.open(tempfile.path) do |zipfile|
...
end
答案 2 :(得分: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