2012-02-13 9 views
5

En realidad, yo estoy haciendo algo como esto:descargar archivos Paperclip como postal

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 

Es un trabajo pero la extensión no se encuentra en los archivos recibidos, alguna idea?

Respuesta

2

finalmente llego a un método dentro del modelo en cuestión para devolver el nombre de archivo con la extensión

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

Sólo cambia :filename => file_name a :filename => file_name.zip

:type sólo se especifica la aplicación que va a utilizar el archivo, pero no la extensión del nombre de archivo

+0

.zip no se perdió al archivo que se perdió a los archivos dentro – Awea

1

Hice algo similar, pero necesitaba tomar los archivos de S3 en lugar del sistema local. Mis archivos no eran grandes, así que decidí simplemente cargarlos en la memoria. Así que en lugar de esto:

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

he añadido un require "open-uri" y luego hicieron esto:

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

Dónde asset es un objeto de clip.

Cuestiones relacionadas