Search code examples
ruby-on-railsrubyziptemporary-files

Using Tempfile to create a zip file in rails


I want to create a temporary .zip in rails. For creating zip file I am using rubyzip gem.

Currently I am doing this:

zfname = Tempfile.new(['somename','.zip'], Rails.root.to_s + '/tmp/')
Zip::ZipFile.open(zfname.path, Zip::ZipFile::CREATE) do |zipfile|
  zipfile.add(file, basepath + file)
end

This generates following error:

Zip::ZipError: Zip end of central directory signature not found

Is it possible to use Tempfile for zip? If yes, what is wrong here?


Solution

  • In my rails app when I needed to send zip files to user, I just stored them in a buffer and used 'send data' method in controller. I was trying to use 'Tempfile' initially but it had an added task of removing zip files after sending it to user which is a pain. Is this something you are looking for?

        Zip::OutputStream.write_buffer do |stream|
          file_paths.each_with_index do |file_path, index|
            # rename the pdf
            stream.put_next_entry("#{name}-#{index + 1}.pdf")
            # add pdf to zip
            stream.write IO.read(file_path)
          end  
        end