【问题标题】:Ruby: reading a temporary zip fileRuby:读取临时 zip 文件
【发布时间】:2012-10-25 19:55:51
【问题描述】:

我有一个 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 文件?

【问题讨论】:

    标签: ruby zip temporary-files


    【解决方案1】:

    请参阅以下文章 http://info.michael-simons.eu/2008/01/21/using-rubyzip-to-create-zip-files-on-the-fly/,其中解释了如果您使用 Tempfile,如何使用更基本的接口 Zip::ZipOutputStream

    【讨论】:

    • 有趣 - 如果我需要写入临时 zip 文件,我会记住这一点。但是,我有不同的情况:我需要从下载创建的临时文件中读取 zip 条目。
    【解决方案2】:

    原来是临时文件损坏了,所以

    can't dup NilClass
    

    错误是由于尝试读取损坏的文件。

    因此解决方案是使用

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

    【讨论】:

      【解决方案3】:

      我遇到了同样的错误,但在挖掘后我发现这些 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-25
        相关资源
        最近更新 更多