2008-10-25 32 views
5

J'essaie d'extraire un fichier zip téléchargé et de stocker son contenu dans la base de données, une entrée par fichier. La bibliothèque de rubyzip n'a presque aucune documentation utile.Comment obtenir le contenu d'un fichier compressé à l'aide de la bibliothèque rubyzip?

Il existe une table d'actifs avec clé: chaîne (nom de fichier) et données: binaire (contenu du fichier).

J'utilise la bibliothèque rubyzip, et ont fait jusqu'à ce que:

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 

Comment puis-je mettre les données à partir d'un ZipEntry? Dois-je utiliser un fichier temporaire?

Répondre

6

Il semblerait que vous pouvez soit utiliser la méthode read_local_entry comme ceci:

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

Ou, vous pouvez enregistrer l'entrée avec cette méthode:

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

Je ne sais pas comment les fonctionnera, mais peut-être qu'ils vous aideront à trouver la bonne méthode (si ce n'est pas le cas).

Et, une alternative plus:

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

Merci. 10 points pour l'effort! – jcoby

9

trouvé une façon encore plus simple:

asset.data = entry.get_input_stream.read