2012-02-13 19 views
5

In realtà sto facendo qualcosa di simile:Scarica file Paperclip come ZIP

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 

E 'un lavoro ma l'estensione non è presente sui file ricevuti, qualche idea?

risposta

2

ho finalmente fare un metodo all'interno del modello in questione per restituire il nome del file con l'estensione

def title_with_ext 
    "#{self.title}#{File.extname(self.image.path)}" 
end 
0

Basta cambiare :filename => file_name a :filename => file_name.zip

:type specifica solo l'applicazione che utilizzerà il file, ma non l'estensione al nome del file

+0

il .zip non perso nell'archivio che mancava ai file all'interno – Awea

1

ho fatto qualcosa di simile, ma aveva bisogno di afferrare i file da S3 al posto del sistema locale. I miei file non erano grandi, quindi ho deciso di caricarli in memoria. Così, invece di questo:

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

ho aggiunto un require "open-uri" e poi ha fatto questo:

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

Dove asset è un oggetto graffetta.