Как распаковать файл в Ruby on Rails?
Я загружаю файл на сервер в Ruby on Rails
Обычно это текстовый файл, и я сохраняю его в модели как поле "файл" в представлении ActiveRecord с другими полями, такими как название представления и т.д.
Однако пользователь может также отправить zip файл. В этом случае zipfile должен распаковываться, и для каждого файла в zip необходимо создать новое Представление с теми же текстовыми полями, но текущий файл.
Как я могу это сделать?
Я просмотрел примеры распаковки в сети, но большинство из них используют каталог для распаковки файлов. Я не уверен, что мне нужно это, как в текущем методе создания SubmissionsController, получен файл-объект, и я предполагаю, что путь сохранения файла к нему автоматически генерируется при вызове метода сохранения отправки. Поэтому я думал, что, возможно, мне нужно распаковать zipfile в память, чтобы получить массив объектов файла, а затем создать новое представление с каждым файловым объектом, но с теми же полями, а затем позволить ActiveRecord генерировать пути к файлам для каждого, когда он сохраняет их в база данных.
Возможно, я ошибаюсь, потому что я немного новый для Rails и Ruby.
Ответы
Ответ 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)