Скачать файлы скрепки в формате ZIP - PullRequest
5 голосов
/ 13 февраля 2012

На самом деле я делаю что-то вроде этого:

project          = Project.find(params[:id])  
attachments_list = project.attachments.where{attach_file_size > 0}
assets_list      = project.assets.where{image_file_size > 0}
#Person.where{(name =~ 'Ernie%') & (salary < 50000) | (name =~ 'Joe%') & (salary > 100000)}
file_name  = project.title.downcase.gsub(' ', '_destroy')
file_name  = "#{file_name}.zip"

temp_file  = Tempfile.new("#{file_name}-#{current_user.id}")
Zip::ZipOutputStream.open(temp_file.path) do |zos|
  attachments_list.each do |file|
    zos.put_next_entry(file.title)
    zos.print IO.read(file.attach.path)
  end
  assets_list.each do |file|
    zos.put_next_entry(file.title)
    zos.print IO.read("#{file.image.path}")
  end
end

send_file temp_file.path, :type => 'application/zip',
                          :disposition => 'attachment',
                          :filename => file_name
temp_file.close

Это работает, но в полученных файлах отсутствует расширение, вы понимаете?

Ответы [ 3 ]

2 голосов
/ 24 февраля 2012

Я наконец-то создаю метод внутри соответствующей модели, чтобы вернуть имя файла с расширением

def title_with_ext
    "#{self.title}#{File.extname(self.image.path)}"
end
1 голос
/ 08 декабря 2016

Я сделал что-то подобное, но мне нужно было получать файлы с S3 вместо локальной системы. Мои файлы были не большими, поэтому я решил просто загрузить их в память. Так что вместо этого:

zos.print IO.read(file.attach.path)

Я добавил require "open-uri", а затем сделал это:

zos.print open(asset.data.url) {|f| f.read}

Где asset - объект скрепки.

0 голосов
/ 13 февраля 2012

Просто измените :filename => file_name на :filename => file_name.zip

:type указывает только приложение, которое будет использовать файл, но не расширение файла

...