Как я могу удалить файл в Sinatra после того, как он был отправлен через send_file?

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

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

12
задан John Reilly 10 May 2010 в 20:05
поделиться

2 ответа

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

4
ответ дан 2 December 2019 в 23:31
поделиться

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

contents = file.read

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

File.delete (file_path)

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

contents

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

0
ответ дан 2 December 2019 в 23:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: