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.