limpia / tmp cuando se termina el archivo de envío

Tengo un plugin de Redmine. Creo un archivo temporal en / tmp, luego lo envío con File.open. Quiero eliminar el archivo temporal cuando el usuario lo ha descargado. Como lo puedo hacer ?

Mi código (en un controlador):

File.open(filelocation, 'r') do |file| send_file file, :filename => filename, :type => "application/pdf", :disposition => "attachment" end 

Si elimino el archivo después de File.open, no funciona.

EDITAR

En mi controlador hago:

 def something temp = Tempfile.new(['PDF_','.pdf']) # ... some code that modify my pdf ... begin File.open(temp.path, 'r') do |file| send_file file, :filename => temp.path, :type => "application/pdf", :disposition => "attachment" end ensure temp.close temp.unlink end end 

Mi archivo temporal se elimina, pero no al final de mi código: el archivo.open abierto devuelve un PDF dañado.

Considere usar la clase Tempfile para su trabajo:

 Tempfile.create('foo', '/tmp') do |f| ... do something with f ... end 

Se incluye en la biblioteca estándar y la limpieza se realiza automáticamente cuando se cierra el bloque.

Referencia: http://www.ruby-doc.org/stdlib-2.1.1/libdoc/tempfile/rdoc/index.html

Utilizo send_data en lugar de send_file, luego borro el archivo. send_data se bloqueará hasta que se envíen los datos, permitiendo que la solicitud de File.delete tenga éxito.

  file = temp.path File.open(file, 'r') do |f| send_data f.read.force_encoding('BINARY'), :filename => filename, :type => "application/pdf", :disposition => "attachment" end File.delete(file) 

fuente: en Ruby on Rails, después del método send_file, elimine el archivo del servidor

    Intereting Posts