Отправка файлов (FileResponse)

Imhotep предоставляет класс Imhotep\Http\FileResponse для отправки файлов с поддержкой HTTP range-запросов, автоматической установки MIME-типов и управления кэшированием.

Базовая отправка файла

Для отправки файла пользователю используйте метод file() глобальной фабрики ответов:

return response()->file('/path/to/file.pdf');
PHP

Файл будет отображён в браузере (inline), а не скачан.

Скачивание файла

Чтобы принудительно скачать файл, используйте метод download():

return response()->download('/path/to/file.pdf');
PHP

Скачивание с другим именем

return response()->download('/path/to/document.pdf', 'report-2024.pdf');
PHP

Скачивание с пользовательскими заголовками

return response()->download('/path/to/file.pdf', 'document.pdf', [
    'X-Custom-Header' => 'Value'
]);
PHP

Создание FileResponse вручную

Для полного контроля создайте экземпляр FileResponse напрямую:

use Imhotep\Http\FileResponse;

return new FileResponse(
    file: '/path/to/file.pdf',
    status: 200,
    headers: ['X-Custom' => 'Value'],
    public: true,           // Публичное или приватное кэширование
    disposition: null,      // 'attachment' для скачивания
    autoEtag: true,         // Автоматическая генерация ETag
    autoLastModified: true  // Автоматическая установка Last-Modified
);
PHP

Управление кэшированием

Установка Etag

$response = response()->file('/path/to/file.pdf');
$response->setEtag(md5_file('/path/to/file.pdf'));

return $response;
PHP

Установка Last-Modified

use DateTimeImmutable;

$response = response()->file('/path/to/file.pdf');
$response->setLastModified(
    DateTimeImmutable::createFromFormat('U', filemtime('/path/to/file.pdf'))
);

return $response;
PHP

Публичное и приватное кэширование

// Публичное кэширование (по умолчанию)
$response = response()->file('/path/to/file.pdf');
$response->setPublicCache();

// Приватное кэширование
$response->setPrivateCache();
PHP

Range-запросы (Partial Content)

FileResponse автоматически поддерживает HTTP Range-запросы для докачки файлов:

// Клиент может запросить: Range: bytes=0-1023
return response()->file('/path/to/large-file.zip');
PHP

Сервер автоматически:

  • Вернёт статус 206 Partial Content
  • Установит заголовки Content-Range и Content-Length
  • Отправит только запрошенную часть файла

Удаление файла после отправки

Для временных файлов можно автоматически удалить файл после отправки:

return response()
    ->download('/tmp/report-123.pdf')
    ->deleteFileAfterSend();
PHP