rails ruby-on-rails ruby file zip

¿Cómo descomprimir un archivo en Ruby on Rails?



rails zip:: file (3)

Extrae archivos Zip en Ruby

Una vez que haya instalado la gema rubyzip , puede usar este método para extraer archivos 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

Lo usas así:

extract_zip(zip_path, extract_destination)

Estoy cargando un archivo al servidor en Ruby on Rails

Normalmente, es un archivo de texto y lo guardo en el modelo como un campo ''archivo'' en un Registro Activo de Presentación con otros campos como el título del envío ... etc.

Sin embargo, el usuario también puede enviar un archivo zip. En este caso, el archivo zip debe descomprimirse y para cada archivo en el archivo comprimido se debe crear una nueva Presentación con los mismos campos de texto, pero el archivo actual.

¿Cómo puedo lograr esto?

Miré ejemplos de descomprimir en la red, pero la mayoría usa un directorio para descomprimir los archivos. No estoy seguro si lo necesito como en el método de creación actual de SubmissionsController, se recibe un objeto de archivo y supongo que la ruta para guardar el archivo se genera automáticamente cuando se llama al método de envío de envío. Así que pensé que tal vez debería descomprimir el archivo zip en memoria para obtener una matriz de objetos de archivo y luego crear una nueva Presentación con cada objeto de archivo pero los mismos campos y luego dejar que ActiveRecord genere las rutas de archivos para cada uno cuando los guarda en el archivo base de datos. Podría estar equivocado aquí, porque soy nuevo en Rails y Ruby.


Desde la página del proyecto RubyZip:

¡La interfaz de Rubyzip cambió! No es necesario que requiera "zip / zip" y el prefijo Zip en los nombres de clase eliminados.

Entonces, el código de ejemplo de @ ben-lee debería actualizarse a algo como esto:

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


Usaría la gema rubyzip . Específicamente esta parte: https://github.com/rubyzip/rubyzip/blob/master/lib/zip/filesystem.rb

Crea un sistema de archivos artificial en la memoria que refleja el contenido del archivo zip. Aquí hay un ejemplo basado en el ejemplo de los documentos:

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

En su caso, simplemente ponga el nombre del archivo temporal cargado donde my.zip está en el ejemplo, y puede recorrer los contenidos y realizar sus operaciones habituales en ellos.