Search code examples
rubysinatra

How can I delete a file in Sinatra after it has been sent via send_file?


I have a simple sinatra application that needs to generate a file (via an external process), send that file to the browser, and finally, delete the file from the filesystem. Something along these lines:

class MyApp < Sinatra::Base
  get '/generate-file' do

    # calls out to an external process, 
    # and returns the path to the generated file
    file_path = generate_the_file()  

    # send the file to the browser
    send_file(file_path)

    # remove the generated file, so we don't
    # completely fill up the filesystem.
    File.delete(file_path)

    # File.delete is never called.

  end
end

It seems, however, that the send_file call completes the request, and any code after it does not get run.

Is there some way to ensure that the generated file is cleaned up after it has been successfully sent to the browser? Or will I need to resort to a cron job running a cleanup script on some interval?


Solution

  • Unfortunately there is no any callbacks when you use send_file. Common solution here is to use cron tasks to clean temp files