У меня есть простое sinatra приложение, которое должно генерировать файл (через внешний процесс), отправить тот файл в браузер, и наконец, удалить файл из файловой системы. Что-то вдоль этих строк:
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
вызов завершает запрос и любой код после того, как это не станет выполненным.
Там некоторый путь состоит в том, чтобы гарантировать, что сгенерированный файл очищен после того, как он был успешно отправлен в браузер? Или я должен буду обратиться к заданию крона, запускающему скрипт очистки на некотором интервале?
К сожалению, при использовании send_file нет обратных вызовов. Распространенным решением здесь является использование задач cron для очистки временных файлов
Это может быть решение временно сохранить содержимое файла в переменной, например:
contents = file.read
После этого удалите файл:
File.delete (file_path)
Наконец, верните содержимое:
contents
Это имеет тот же эффект, что и ваш send_file ()
.