Класс BinaryFileResponse
Класс BinaryFileResponse предназначен для отправки бинарных файлов в ответе HTTP. Он расширяет класс Response и добавляет специфическую функциональность для работы с файлами, такие как управление заголовками, поддержка частичной загрузки (range requests) и отправка файлов на скачивание. Первым параметром конструктора передаётся путь к файлу в виде строки или объекта SplFileInfo. Вторым параметром можно указать HTTP-статус ответа, по умолчанию 200. Третьим параметром передаются дополнительные заголовки в виде массива. Четвертый параметр определяет, следует ли автоматически удалять файл после отправки (по умолчанию false). Пятый параметр позволяет явно указать MIME-тип файла.
Синтаксис
<?php
new BinaryFileResponse(
string|SplFileInfo $file,
int $status = 200,
array $headers = [],
bool $deleteFileAfterSend = false,
?string $mimeType = null
);
?>
Пример
Давайте отправим изображение в ответе на запрос:
<?php
namespace App\Http\Controllers;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
class ImageController extends Controller
{
public function show(string $filename): BinaryFileResponse
{
$path = storage_path('app/images/' . $filename);
return new BinaryFileResponse($path);
}
}
?>
Результат выполнения кода:
"BinaryFileResponse object with image data"
Пример
Давайте отправим файл со статусом 200 и дополнительными заголовками:
<?php
namespace App\Http\Controllers;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
class FileController extends Controller
{
public function download(string $filename): BinaryFileResponse
{
$path = public_path('uploads/' . $filename);
$headers = [
'Content-Type' => 'application/pdf',
'X-Custom-Header' => 'CustomValue',
];
return new BinaryFileResponse($path, 200, $headers);
}
}
?>
Результат выполнения кода:
"BinaryFileResponse with custom headers"
Пример
Давайте создадим ответ, который автоматически удаляет файл после отправки:
<?php
namespace App\Http\Controllers;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
class TempFileController extends Controller
{
public function serveTemporaryFile(): BinaryFileResponse
{
$tempPath = storage_path('app/temp/temp_file.txt');
$deleteAfterSend = true;
return new BinaryFileResponse($tempPath, 200, [], $deleteAfterSend);
}
}
?>
Результат выполнения кода:
"BinaryFileResponse will delete file after sending"
Пример
Давайте используем объект SplFileInfo и укажем явный MIME-тип:
<?php
namespace App\Http\Controllers;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use SplFileInfo;
class DocumentController extends Controller
{
public function showDocument(): BinaryFileResponse
{
$file = new SplFileInfo(storage_path('app/documents/document.docx'));
$mimeType = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
return new BinaryFileResponse($file, 200, [], false, $mimeType);
}
}
?>
Результат выполнения кода:
"BinaryFileResponse with explicit MIME type"
Пример
Давайте обработаем ошибку, если файл не найден:
<?php
namespace App\Http\Controllers;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class SafeFileController extends Controller
{
public function safeShow(string $filename): BinaryFileResponse
{
$path = storage_path('app/files/' . $filename);
if (!file_exists($path)) {
throw new NotFoundHttpException('File not found');
}
return new BinaryFileResponse($path);
}
}
?>
Результат выполнения кода:
"BinaryFileResponse if file exists, NotFoundHttpException otherwise"
Смотрите также
-
класс
Response,
который является базовым для всех HTTP-ответов -
метод
file,
который упрощает отправку файлов в ответе -
метод
download,
который добавляет заголовки для скачивания файла -
класс
StreamedResponse,
который используется для потоковой передачи данных