usos tutorial sintaxis rails que funciona español ejemplo como caracteristicas ruby-on-rails ruby file x-sendfile

ruby-on-rails - tutorial - ruby on rails usos



En Ruby on Rails, después del método send_file, elimine el archivo del servidor (3)

¡Esto funciona para mí! Con send_data puedes borrar el archivo antes de enviarlo.

file = File.open(Rails.root.join(''public'', ''uploads'', filename), "rb") contents = file.read file.close File.delete(filepath) if File.exist?(filepath) send_data(contents, :filename => filename)

Estoy usando el siguiente código para enviar el archivo en Rails.

if File.exist?(file_path) send_file(file_path, type: ''text/excel'') File.delete(file_path) end

En esto estoy intentando enviar el archivo y eliminar el archivo del servidor una vez que se haya enviado con éxito. Pero el problema es que la operación de eliminación se ejecuta mientras se realiza el envío y, debido a eso, no veo nada en el navegador.

Entonces, ¿hay alguna manera en Rails, una vez que se complete la operación send_file, elimine el archivo del servidor?

Cualquier ayuda en esto sería altamente apreciada.

Gracias,
Chetan


Si está generando sobre la marcha el archivo que intenta enviar, una solución es utilizar la clase Tempfile :

begin # The second argument is optional: temp_file = Tempfile.new(filename, temp_directory) # ... edit temp_file as needed. # By default, temp files are 0600, # so this line might be needed depending on your configuration: temp_file.chmod(0644) send_file temp_file ensure temp_file.close end

Al contrario de lo que se indica en esta pregunta , esto funciona como se esperaba (el archivo permanece en el servidor el tiempo suficiente para que se sirva, pero finalmente se elimina); Este post parece indicar que esto se debe a las actualizaciones en Rails 3.2.11, algo que no pude verificar.


Debido a que está utilizando send_file , Rails pasará la solicitud a su servidor HTTP (nginx, apache, etc. - Consulte la documentación de Rails en send_file con respecto a los encabezados de X-Sendfile ). Debido a esto, cuando intenta eliminar el archivo, Rails no sabe que todavía se está utilizando.

Puede intentar usar send_data en send_data lugar, que se bloqueará hasta que se envíen los datos, permitiendo que su solicitud de File.delete exitosa. Tenga en cuenta que send_data requiere un flujo de datos como argumento, no una ruta, por lo que primero debe abrir el archivo:

File.open(file_path, ''r'') do |f| send_data f.read, type: "text/excel" end File.delete(file_path)

La otra opción sería un trabajo en segundo plano que verifique periódicamente que los archivos temporales se eliminen.