Trong Rails 5, để xử lý nén và giải nén file zip, chúng ta sử dụng 1 thư viện của Ruby là rubyzip. Trong bài viết này, mình sẽ hướng dẫn các bạn sử dụng thư viện rubyzip để nén 1 file từ 1 thư mục mà vẫn giữ nguyên cấu trúc thư mục, và giải nén 1 file ra thư mục trong Ruby on Rails
* Tài liệu về RubyZip: https://github.com/rubyzip/rubyzip
Hướng dẫn nén và giải nén file zip giữ nguyên cấu trúc thư mục
1. Thêm thư viện rubyzip vào project
– Sửa file Gemfile của Rails Project, thêm dependency sau:
# Ruby zip gem 'rubyzip', '>= 1.0.0'
– Chạy command sau để update gem cho Rails
bundle update
Nếu thành công thì khi check thông tin gem bạn sẽ có kết quả như bên dưới.
2. Function giải nén (unzip) file zip mà vẫn giữ nguyên cấu trúc thư mục trong file zip
require 'zip' # unzip_foder def unzip_folder(file_path) Zip::File.open(file_path) do |zip_file| zip_file.each do |f| f_path = [‘/tmp’, f.name].join('/') FileUtils.mkdir_p(File.dirname(f_path)) zip_file.extract(f, f_path) end end end
3. Function nén folder thành file zip mà vẫn giữ nguyên cấu trúc thư mục
require 'zip' # zip folder def zip_folder(dist_path) source_path = ‘/tmp/source’ Zip::File.open(dist_path, Zip::File::CREATE) do |zip_file| Dir.chdir source_path Dir.glob('**/*').each do |file| zip_file.add(file.sub(source_path + '/', ''), file) end end end
Nguồn: vinasupport.com