Класс BinaryFileResponse
Класс BinaryFileResponse расширяет класс Response
и используется для отправки файлов клиенту. Первым параметром
в конструктор передаётся путь к файлу. Вторым параметром можно
указать статус-код ответа, третьим - массив HTTP-заголовков,
четвёртым - нужно ли удалять файл после отправки. В отличие от
обычного Response, данный класс не загружает содержимое
файла в память целиком, а отдаёт его потоком, что экономит
ресурсы сервера при работе с большими файлами.
Синтаксис
<?php
use Symfony\Component\HttpFoundation\BinaryFileResponse;
$response = new BinaryFileResponse(
string $file,
int $status = 200,
array $headers = [],
bool $deleteFileAfterSend = false
);
?>
Пример
Давайте отправим клиенту файл изображения, расположенный в публичной директории проекта:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\Routing\Attribute\Route;
class FileController extends AbstractController
{
#[Route('/file', name: 'file_show')]
public function show(): BinaryFileResponse
{
return new BinaryFileResponse('/path/to/image.png');
}
}
?>
При обращении к адресу /file браузер получит файл
image.png с заголовком Content-Type,
определённым автоматически по расширению.
Пример
Давайте отдадим файл, который нужно удалить после отправки. Это удобно для временных файлов, например сгенерированных отчётов:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\Routing\Attribute\Route;
class FileController extends AbstractController
{
#[Route('/report', name: 'file_report')]
public function report(): BinaryFileResponse
{
$file = '/tmp/report.pdf';
$response = new BinaryFileResponse($file, 200, [], true);
$response->deleteFileAfterSend(true);
return $response;
}
}
?>
После того как файл будет полностью отдан клиенту, Symfony автоматически удалит его с диска.
Пример
Давайте зададим собственное имя файла, которое увидит
пользователь при скачивании, с помощью метода
setContentDisposition:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\Routing\Attribute\Route;
class FileController extends AbstractController
{
#[Route('/download', name: 'file_download')]
public function download(): BinaryFileResponse
{
$response = new BinaryFileResponse('/path/to/article.pdf');
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
'article.pdf'
);
return $response;
}
}
?>
Браузер предложит пользователю сохранить файл под именем
article.pdf вместо открытия его в окне просмотра.
Смотрите также
-
класс
Response,
который является базовым классом для всех HTTP-ответов -
метод
setContentDisposition,
который задаёт имя файла и способ его отображения -
метод
deleteFileAfterSend,
который удаляет файл после отправки клиенту -
класс
StreamedResponse,
который отдаёт данные потоком без буферизации