Как удалить файл в Sinatra после его отправки через send_file?

У меня есть простое приложение для синатры, которому нужно сгенерировать файл (через внешний процесс), отправить этот файл в браузер и, наконец, удалить файл из файловой системы. Что-то в этом роде:

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

Кажется, однако, что вызов send_file завершает запрос, и любой код после него не запускается.

Есть ли способ убедиться, что сгенерированный файл очищен после того, как он был успешно отправлен в браузер? Или мне нужно прибегнуть к заданию cron, выполняющему очистку script на некотором интервале?

Ответ 1

К сожалению, никаких обратных вызовов при использовании send_file нет. Общим решением здесь является использование задач cron для очистки временных файлов

Ответ 2

Это может быть решение для временного хранения содержимого файла в переменной, например:

contents = file.read

После этого удалите файл:

File.delete(путь_к_файл)

Наконец, верните содержимое:

Содержание

Это имеет тот же эффект, что и ваш send_file().