如何在Ruby on Rails中解压缩文件?

sia*_*mii 41 ruby zip ruby-on-rails file

我正在Ruby on Rails上将文件上传到服务器

通常,它是一个文本文件,我将其作为提交ActiveRecord中的"文件"字段保存在模型中,其他字段包括提交标题等.

但是,用户也可以提交zip文件.在这种情况下,zip文件应该解压缩,并且对于zip中的每个文件,应该使用相同的文本字段创建新的Submission,但是当前文件.

我怎么能做到这一点?

我查看了网络上的解压缩示例,但大多数都使用目录来解压缩文件.我不确定我是否需要它,因为在当前的SubmissionsController创建方法中,接收到一个文件对象,并且我假定在调用Submission save方法时自动生成保存文件的路径.所以我想也许我应该将zip文件解压缩到内存中以获取文件对象数组,然后使用每个文件对象创建一个新的Submission但是相同的字段然后让ActiveRecord在将它们保存到文件时为每个文件生成文件路径.数据库.我可能在这里错了,因为我对Rails和Ruby有点新意.

Ben*_*Lee 44

我会使用rubyzip gem.特别是这部分:https://github.com/rubyzip/rubyzip/blob/master/lib/zip/filesystem.rb

它在内存中创建一个人工文件系统,镜像zip文件的内容.以下是基于文档示例的示例:

Rubyzip interface changed!!! No need to do require "zip/zip" and Zip prefix in class names removed.

require 'zip'

Zip::File.open("my.zip") do |zipfile|
  zipfile.each do |file|
    # do something with file
  end
end
Run Code Online (Sandbox Code Playgroud)

在您的情况下,只需将上传的临时文件的名称放在my.zip示例中,您就可以遍历内容并对它们进行常规操作.

  • @ bizso09,查看文档和exmample.你可以从ZipFile中提取文件,比如`zip_file.extract(f,f_path),除非File.exist?(f_path)` (2认同)

Bil*_*ram 26

从RubyZip项目页面:

Rubyzip界面改变了!无需执行"zip/zip"和删除类名中的Zip前缀.

因此,@ ben-lee的示例代码应该更新为:

require 'zip'

Zip::File.open("my.zip") do |zipfile|
  zipfile.each do |file|
    # do something with file
  end
end
Run Code Online (Sandbox Code Playgroud)


She*_*yar 17

在Ruby中提取Zip文件

安装rubyzipgem后,可以使用此方法提取zip文件:

require 'zip'

def extract_zip(file, destination)
  FileUtils.mkdir_p(destination)

  Zip::File.open(file) do |zip_file|
    zip_file.each do |f|
      fpath = File.join(destination, f.name)
      zip_file.extract(f, fpath) unless File.exist?(fpath)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

你这样使用它:

extract_zip(zip_path, extract_destination)
Run Code Online (Sandbox Code Playgroud)

  • @JonBurgess似乎是要避免用相同的名称替换现有文件。 (2认同)