Как я могу удалить файл в Синатре после того, как он был отправлен через send_file? - PullRequest
12 голосов
/ 11 мая 2010

У меня есть простое приложение 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 завершает запрос, и любой код после него не запускается.

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

Ответы [ 3 ]

4 голосов
/ 11 мая 2010

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

1 голос
/ 03 июля 2018

Вы можете использовать блок начала ..., чтобы очистить файл:

file_path = generate_the_file()  
begin
  send_file(file_path)
ensure
  File.delete(file_path)
end

Это работает, потому что внутри Синатры. #send_file вызывает #halt, а затем #halt вызывает throw :halt. Когда вызывается throw , стек разматывается до соответствующего catch (который находится где-то в Синатре), но, поскольку стек разматывается, гарантирует, что блоки будут запущены .

0 голосов
/ 26 мая 2010

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

содержание = file.read

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

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

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

содержание

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...