Generating ZIP files via Ruby on Rails using rubyzip
Posted by Bhushan Ahire | Posted in Rails, ruby | Posted on 03-03-2009
2
gem install rubyzip
Then, in the model that I’m using to generate the zip bundles, I add a couple “require” statements:
require 'zip/zip' require 'zip/zipfilesystem' class Album < ActiveRecord::Base (...) end
Next, I added a class method called bundle, which when called will use rubygem to generate the zip file. Note: the “permalink” attributes of Album and Artist are populated when an object of those models is created. I’m using them because it makes for nice filenames, too.
# create a zipped archive file of all the tracks in an album
def bundle(name = self.permalink, set = self.artist.permalink)
bundle_filename = "#{RAILS_ROOT}/public/uploads/#{set}-#{name}.zip"
# check to see if the file exists already, and if it does, delete it.
if File.file?(bundle_filename)
File.delete(bundle_filename)
end
# set the bundle_filename attribute of this object
self.bundle_filename = "/uploads/#{set}-#{name}.zip"
# open or create the zip file
Zip::ZipFile.open(bundle_filename, Zip::ZipFile::CREATE) {
|zipfile|
# collect the album's tracks
self.tracks.collect {
|track|
# add each track to the archive, names using the track's attributes
zipfile.add( "#{set}/#{track.num}-#{track.filename}", "#{RAILS_ROOT}/public#{track.public_filename}")
}
}
# set read permissions on the file
File.chmod(0644, bundle_filename)
# save the object
self.save
end
Next I added a method in my controller:
def create_bundle album = Album.find(params[:id]) album.bundle flash[:notice] = 'Album was successfully zipped.' redirect_to album_url(album.artist, album) end
And edit my routes.rb accordingly:
map.create_bundle 'create_bundle/:id', :controller => 'albums', :action => 'create_bundle'
Now it’s just a matter of creating a link in the view for the admin to click whenever he/she wants to generate the zip file:
<%= link_to('Create Album Zip', create_bundle_path(@album)) %>
…and a link for the user to click to download the zip file if it exists:
<% unless @album.bundle_filename.nil? %><%= link_to "Download Album Zip", @album.bundle_filename %><% end %>
That’s it! Refer to the rubyzip documentation for more info.

very good example. thanks for posting it, it’s quite clear.
i just with i didn’t have to log in to praise your work, but hey, spam’s a bitch.
cheers!
Am glad you got solution of your problem.
Bcas of spam only I kept login on.