2012-02-09 18 views
31

che sto caricando un file sul server in Ruby on RailsCome decomprimere un file in Ruby on Rails?

Normalmente, si tratta di un file di testo e li risparmio nel modello come un campo di 'file' in un Submission ActiveRecord con altri campi come titolo di presentazione .. ecc

Tuttavia, l'utente può anche inviare un file zip. In questo caso il file zip deve essere decompresso e per ogni file nel file zip deve essere creato un nuovo invio con gli stessi campi di testo, ma il file corrente.

Come posso realizzare questo?

ho guardato esempi decomprimere sulla rete, ma la maggior parte utilizza una directory per decomprimere i file. Non sono sicuro di averne bisogno come nel metodo di creazione corrente di SubmissionsController, viene ricevuto un oggetto file e presumo che il percorso per salvare il file sia generato automaticamente quando viene chiamato il metodo di salvataggio di invio. Stavo pensando che forse dovrei decomprimere il file zip nella memoria per ottenere un array di oggetti file e quindi creare un nuovo invio con ogni oggetto file, ma stessi campi e poi lasciare che ActiveRecord generare i percorsi dei file per ciascuno di essi quando li salva la Banca dati. Potrei sbagliarmi qui, perché sono un po 'nuovo a Rails e Ruby.

risposta

33

userei il rubyzip gem. Nello specifico questa parte: https://github.com/rubyzip/rubyzip/blob/master/lib/zip/filesystem.rb

Crea un file system artificiale in memoria che rispecchia il contenuto del file zip. Ecco un esempio basato dell'esempio dalla documentazione:

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 

Nel tuo caso, basta mettere il nome del file temporaneo caricato dove my.zip è nell'esempio, e è possibile scorrere il contenuto e fai le tue normali operazioni su di loro.

+0

vedo, così come avrei potuto ottenere un array di oggetti di file dal file zip? – siamii

+0

@ bizso09, ho appena aggiornato per mostrare come scorrere i contenuti. C'è anche un semplice tutorial explaning qui: http://www.markhneedham.com/blog/2008/10/02/ruby-unzipping-a-file-using-rubyzip/ –

+0

grazie. Provo ora – siamii

25

dalla pagina del progetto RubyZip:

interfaccia Rubyzip cambiato !!! Non è necessario richiedere "zip/zip" e il prefisso Zip nei nomi delle classi rimossi.

Quindi, il codice di esempio da @ Ben-lee dovrebbe essere aggiornata per qualcosa di simile:

require 'zip' 

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

estrarre i file ZIP in Ruby

Una volta installato il rubyzip gemma, si può utilizzare questo metodo per estrarre i 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 

Si utilizza in questo modo:

extract_zip(zip_path, extract_destination) 
+0

Non so se sia stato modificato di recente o meno, ma il metodo 'extract' richiede solo un arg e genererà un errore se gliene date due. – 0112

+0

Qual è la ragione della condizione 'a meno che File.exist? (Fpath)'? È giusto replicare il comportamento di altri strumenti? –