上传一个压缩文件并解压,同时保持原目录不变

Posted

技术标签:

【中文标题】上传一个压缩文件并解压,同时保持原目录不变【英文标题】:Upload a zipped file and unzip it while maintaining the original directory 【发布时间】:2019-06-10 07:37:33 【问题描述】:

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

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

对于大多数文件可能很大且需要时间处理的实际场景 - 更好的方法是在后台作业中异步处理,因为 rails 有 ActiveJob framework

【讨论】:

以上是关于上传一个压缩文件并解压,同时保持原目录不变的主要内容,如果未能解决你的问题,请参考以下文章

linux redhat 红帽 centos 压缩 解压缩

zip压缩工具 tar打包打包并压缩

java上传图片并压缩图片大小

Linux下rar 命令压缩和解压详解

压缩,解压命令

压缩,打包的常用工具