Метод guessExtension
Метод guessExtension класса UploadedFile
возвращает расширение файла, определённое на основе
его MIME-типа. В отличие от метода getClientOriginalExtension,
который возвращает расширение, указанное клиентом,
метод guessExtension анализирует реальное содержимое
файла и подбирает соответствующее расширение из таблицы
соответствия MIME-типов. Если определить расширение
не удаётся, метод возвращает null.
Синтаксис
public function guessExtension(): ?string
Пример
Давайте получим расширение загруженного файла в контроллере:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class UploadController extends AbstractController
{
#[Route('/upload', name: 'upload_file')]
public function upload(Request $request): Response
{
$file = $request->files->get('file');
if ($file === null) {
return new Response('no file');
}
$ext = $file->guessExtension();
return new Response($ext ?? 'unknown');
}
}
?>
Результат выполнения кода для загруженного PNG-изображения:
"png"
Пример
Давайте сравним результат работы методов
guessExtension и getClientOriginalExtension:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class UploadController extends AbstractController
{
#[Route('/compare', name: 'compare_ext')]
public function compare(Request $request): Response
{
$file = $request->files->get('file');
if ($file === null) {
return new Response('no file');
}
$guessed = $file->guessExtension();
$original = $file->getClientOriginalExtension();
return new Response($guessed . ' / ' . $original);
}
}
?>
Результат выполнения кода, когда клиент
загрузил JPEG-файл с именем 'image.txt':
"jpeg / txt"
Как видно из результата, метод guessExtension
определил настоящее расширение 'jpeg',
а метод getClientOriginalExtension вернул
расширение, указанное клиентом - 'txt'.
Пример
Давайте используем метод guessExtension
для формирования безопасного имени файла
при сохранении на сервере:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class UploadController extends AbstractController
{
#[Route('/save', name: 'save_file')]
public function save(Request $request): Response
{
$file = $request->files->get('file');
if ($file === null) {
return new Response('no file');
}
$ext = $file->guessExtension() ?? 'bin';
$name = 'upload_' . uniqid() . '.' . $ext;
$file->move(
$this->getParameter('kernel.project_dir') . '/public/uploads',
$name
);
return new Response($name);
}
}
?>
Результат выполнения кода для загруженного PDF-файла:
"upload_6512f8a1b2c3d.pdf"
Смотрите также
-
класс
UploadedFile,
который представляет загруженный файл -
метод
getClientOriginalExtension,
который возвращает расширение, указанное клиентом -
метод
getClientOriginalName,
который возвращает оригинальное имя файла -
метод
move,
который перемещает загруженный файл