Подтвердить что ты не робот

Как распаковать файл в Ruby on Rails?

Я загружаю файл на сервер в Ruby on Rails

Обычно это текстовый файл, и я сохраняю его в модели как поле "файл" в представлении ActiveRecord с другими полями, такими как название представления и т.д.

Однако пользователь может также отправить zip файл. В этом случае zipfile должен распаковываться, и для каждого файла в zip необходимо создать новое Представление с теми же текстовыми полями, но текущий файл.

Как я могу это сделать?

Я просмотрел примеры распаковки в сети, но большинство из них используют каталог для распаковки файлов. Я не уверен, что мне нужно это, как в текущем методе создания SubmissionsController, получен файл-объект, и я предполагаю, что путь сохранения файла к нему автоматически генерируется при вызове метода сохранения отправки. Поэтому я думал, что, возможно, мне нужно распаковать zipfile в память, чтобы получить массив объектов файла, а затем создать новое представление с каждым файловым объектом, но с теми же полями, а затем позволить ActiveRecord генерировать пути к файлам для каждого, когда он сохраняет их в база данных. Возможно, я ошибаюсь, потому что я немного новый для Rails и Ruby.

4b9b3361

Ответ 1

Я бы использовал драгоценный камень rubyzip. В частности, эта часть: 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

В вашем случае просто поместите имя загруженного временного файла, где my.zip находится в примере, и вы можете прокручивать содержимое и выполнять свои обычные операции над ними.

Ответ 2

На странице проекта 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

Ответ 3

Извлечь Zip файлы в Ruby

Как только вы установили камень rubyzip, вы можете использовать этот метод для извлечения 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

Вы используете его следующим образом:

extract_zip(zip_path, extract_destination)