Trong Rails 5, để xử lý việc nén và giải nén các tệp zip, chúng ta có thể sử dụng thư viện Ruby là “rubyzip”. Trong hướng dẫn này, tôi sẽ giúp bạn hiểu cách sử dụng thư viện “rubyzip” để nén một tệp từ một thư mục cụ thể và duy trì cấu trúc thư mục ban đầu. Chúng ta cũng sẽ tìm hiểu cách giải nén một tệp zip và đưa nó vào một thư mục cụ thể 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