Рейтинг:1

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

флаг br

Начиная с Как создать URL-адрес для загрузки файла? Я создал собственный контроллер, который позволяет пользователям загружать PDF-файл.

мой_модуль.routing.yml

мой_модуль.pdf_ссылка:
  путь: '/мой-модуль/pdf/скачать'
  значения по умолчанию:
    _title: 'скачать PDF'
    _controller: '\Drupal\my_module\Controller\MyModuleController::downloadPDF'
  требования:
    _role: 'аутентифицированный'

MyModuleController

общедоступная функция downloadPDF() {
  $pdf_stream = $this->restCallThatReturnAPdfStream();

  $ заголовки = [
    'Content-Type' => 'приложение/pdf',
    'Content-Disposition' => 'attachment;filename="download.pdf"'
  ];

  $temporary_pdf_file = $this->fileSystem->saveData($pdf_stream, 'temporary://mytempfile.pdf', FileSystemInterface::EXISTS_REPLACE); 

  вернуть новый BinaryFileResponse($temporary_pdf_file, 200, $headers, TRUE);
}

Этот файл должен быть приватным для каждого пользователя, чтобы другие пользователи не могли его загрузить.

Я думаю, что мог бы удалить файл после того, как контроллер вернет ответ, вместо того, чтобы выполнять какую-то сложную проверку контроля доступа к файлу, но я понятия не имею, как это легко сделать.

Например, я мог бы установить очередь Cron для удаления этих файлов каждые N минут, но это кажется излишним.

Я также не могу измениться при удалении временных файлов, потому что эти файлы используются где-то еще на сайте, и я бы не рискнул нарушить какую-то другую существующую логику.

Рейтинг:1
флаг cn

Вы ищете BinaryFileResponse::deleteFileAfterSend:

$response = новый BinaryFileResponse($temporary_pdf_file, 200, $headers, TRUE);
вернуть $response->deleteFileAfterSend(TRUE);
Giuseppe avatar
флаг br
Спасибо, это было прямо у меня под носом, но я смог найти это xD

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.