2012-02-09 36 views
31

Tôi đang tải tệp lên máy chủ trong Ruby on RailsLàm thế nào để giải nén một tập tin trong Ruby on Rails?

Thông thường, đó là tệp văn bản và tôi lưu tệp đó vào mô hình dưới dạng trường 'tệp' trong ActiveRecord gửi với các trường khác như tiêu đề gửi .. v.v.

Tuy nhiên, người dùng cũng có thể gửi tệp zip. Trong trường hợp này zipfile nên giải nén và cho mỗi tập tin trong zip một Submission mới nên được tạo ra với các lĩnh vực văn bản tương tự, nhưng tập tin hiện hành.

Tôi làm cách nào để thực hiện việc này?

Tôi đã xem các ví dụ giải nén trên mạng, nhưng hầu hết sử dụng thư mục để giải nén tệp. Tôi không chắc chắn nếu tôi cần rằng như trong phương pháp tạo hiện tại của SubmissionsController, một đối tượng tập tin được nhận và tôi đoán đường dẫn để lưu tập tin được tự động tạo ra khi phương thức lưu thông tin được gọi. Vì vậy, tôi đã nghĩ rằng có lẽ tôi nên giải nén zipfile trong bộ nhớ để có được một mảng các đối tượng tập tin và sau đó tạo một thông tin mới với mỗi đối tượng tập tin nhưng các trường tương tự và sau đó cho phép ActiveRecord tạo đường dẫn tệp cho mỗi khi nó lưu chúng vào cơ sở dữ liệu. Tôi có thể sai ở đây, vì tôi là người mới với Rails và Ruby.

Trả lời

33

Tôi muốn sử dụng rubyzip gem. Cụ thể là phần này: https://github.com/rubyzip/rubyzip/blob/master/lib/zip/filesystem.rb

Nó tạo hệ thống tệp nhân tạo trong bộ nhớ phản ánh nội dung của tệp zip. Dưới đây là một ví dụ dựa trên ví dụ từ các tài liệu:

Rubyzip interface changed!!! No need to do require "zip/zip" and Zip prefix in class names removed.

require 'zip' 

Zip::File.open("my.zip") do |zipfile| 
    zipfile.each do |file| 
    # do something with file 
    end 
end 

Trong trường hợp của bạn, chỉ cần đặt tên của tempfile tải lên nơi my.zip là trong ví dụ, và bạn có thể lặp qua các nội dung và thực hiện các hoạt động thường xuyên của bạn trên chúng.

+0

Tôi hiểu, vậy làm cách nào tôi có thể nhận được một mảng đối tượng tệp từ tệp zip? – siamii

+0

@ bizso09, tôi vừa cập nhật để hiển thị cách lặp qua nội dung. Ngoài ra còn có một hướng dẫn đơn giản giải thích nó ở đây: http://www.markhneedham.com/blog/2008/10/02/ruby-unzipping-a-file-using-rubyzip/ –

+0

cảm ơn. Tôi thử nó bây giờ – siamii

25

Từ trang dự án RubyZip:

Rubyzip giao diện thay đổi !!! Không cần phải yêu cầu "zip/zip" và tiền tố Zip trong tên lớp được xóa.

Vì vậy, các mã ví dụ từ @ ben-lee nên được cập nhật để một cái gì đó như thế này:

require 'zip' 

Zip::File.open("my.zip") do |zipfile| 
    zipfile.each do |file| 
    # do something with file 
    end 
end 
10

Giải nén file Zip trong Ruby

Một khi bạn đã cài đặt rubyzip đá quý, bạn có thể sử dụng phương pháp này để giải nén file zip:

require 'zip' 

def extract_zip(file, destination) 
    FileUtils.mkdir_p(destination) 

    Zip::File.open(file) do |zip_file| 
    zip_file.each do |f| 
     fpath = File.join(destination, f.name) 
     zip_file.extract(f, fpath) unless File.exist?(fpath) 
    end 
    end 
end 

Bạn sử dụng nó như sau:

+0

Tôi không biết nếu nó được thay đổi gần đây hay không, nhưng phương thức 'extract' chỉ mất một arg, và sẽ ném một lỗi nếu bạn cho nó hai. – 0112

+0

Lý do đằng sau điều kiện là gì trừ khi File.exist? (Fpath) '? Đó có phải là để nhân rộng hành vi của các công cụ khác không? –

Các vấn đề liên quan