Загрузите заархивированный файл и разархивируйте его, сохраняя при этом исходный каталог - PullRequest
0 голосов
/ 16 января 2019

Я создаю приложение парсера логов. Я следовал учебному пособию о том, как сделать функцию загрузки, которая работала. Моя new.html.erb для моей функции загрузки выглядит следующим образом (учебное пособие было адаптировано для приема резюме, поэтому некоторые методы из моего кода читаются как @resume):

   <div class="container">   
       <% if @resume.errors.present? %>    
          <div>   
             <ul>   
                <% @resume.errors.full_messages.each do |msg| %>   
                   <li><%= msg %></li>   
                <% end %>
               </ul>   
          </div>   
       <% end %>   

   <div>   
      <%= form_for @resume, html: { multipart: true } do |f| %>   
         <%= f.label :name %>   
         <%= f.text_field :name %>   
         <br><br>   
         <%= f.label :attachment %>   
         <%= f.file_field :attachment %>   
         <br>   
         <%= f.submit "Save" %>   
      <% end %>   
   </div>   

Мой resume.rb выглядит так:

class Resume < ApplicationRecord
   mount_uploader :attachment, AttachmentUploader  

   validates :name, presence: true 
end

Мой attachment_uploader.rb выглядит так:

class AttachmentUploader < CarrierWave::Uploader::Base
  # Include RMagick or MiniMagick support:
  # include CarrierWave::RMagick
  # include CarrierWave::MiniMagick

  # Choose what kind of storage to use for this uploader:
  storage :file
  # storage :fog

  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

end

В качестве следующего шага я пытаюсь загрузить заархивированный файл, содержащий несколько файлов журнала. Я столкнулся с этим вопросом , в котором объясняется, как его распаковать, а не как извлечь при загрузке заархивированного файла. Код оттуда выглядит так:

Zip::ZipFile.open(file_path) { |zip_file|
     zip_file.each { |f|
     f_path=File.join("destination_path", f.name)
     FileUtils.mkdir_p(File.dirname(f_path))
     zip_file.extract(f, f_path) unless File.exist?(f_path)
   }
  } 

Где мне разместить эти конкретные строки кода (из URL, который я вставил выше) в моей программе, если они вообще совместимы? Должно ли оно быть в файле .erb или .rb, и если да, то какой и как?

1 Ответ

0 голосов
/ 16 января 2019

Самый простой способ проверить, работает ли ваш код - вы можете синхронно обрабатывать его в контроллере после успешного сохранения модели (в действии create).

Для большинства реальных сценариев, где файлы могут быть большими и требовать времени для обработки - лучший способ - асинхронная обработка в фоновых заданиях, для которых рельсы имеют ActiveJob framework

...