2008-10-25 14 views
5

Estoy tratando de extraer un archivo zip cargado y almacenar su contenido en la base de datos, una entrada por archivo. La biblioteca rubyzip casi no tiene documentación útil.¿Cómo obtengo el contenido de un archivo comprimido usando la biblioteca rubyzip?

Hay una tabla de activos que tiene la clave: cadena (nombre de archivo) y datos: binario (contenido del archivo).

estoy usando la biblioteca rubyzip, y han hecho que sea tan lejos como esto:

Zip::ZipFile.open(@file_data.local_path) do |zipfile| 
    zipfile.each do |entry| 
    next if entry.name =~ /__MACOSX/ or entry.name =~ /\.DS_Store/ or !entry.file? 

    asset = self.assets.build 
    asset.key = entry.name 
    asset.data = ?? # what goes here? 
    end 
end 

¿Cómo se establecen los datos de un ZipEntry? ¿Tengo que usar un archivo temporal?

Respuesta

6

Parecería que se puede utilizar el método de read_local_entry así:

asset.data = entry.read_local_entry {|z| z.read } 

O bien, puede guardar la entrada con este método:

data = entry.extract "#{RAILS_ROOT}/#{entry.name}" 
asset.data = File.read("#{RAILS_ROOT}/#{entry.name}") 

No estoy seguro de cómo los funcionará, pero tal vez lo ayuden a encontrar el método correcto (si no es así).

Y, una alternativa más:

asset.data = zipfile.file.read(entry.name) 
+0

Gracias. 10 puntos por esfuerzo! – jcoby

9

encontrado una manera aún más sencilla:

asset.data = entry.get_input_stream.read 
Cuestiones relacionadas