上传一个压缩文件并解压,同时保持原目录不变
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
【讨论】:
以上是关于上传一个压缩文件并解压,同时保持原目录不变的主要内容,如果未能解决你的问题,请参考以下文章