上载压缩文件并解压缩,同时保持原始目录

时间:2019-01-16 08:51:51

标签: ruby-on-rails file-upload zip unzip

我正在构建一个日志解析器应用程序。我遵循了有关如何制作上传功能的教程,该教程有效。我用于上传功能的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

下一步,我尝试上载包含多个日志文件的压缩文件。我碰到了this question,它说明了如何提取文件,但没有说明在上传压缩文件时如何提取文件。那里的代码如下:

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 :(得分:0)

测试代码是否正常的最简单方法-成功保存模型后(在create操作中,可以在控制器中进行同步处理。

在大多数实际情况下,文件可能很大并且需要花费一些时间来处理-更好的方法是在后台作业中异步处理,因为这些滑轨具有ActiveJob framework