У меня есть простой контроллер, который обрабатывает загрузку изображений. Перед сохранением изображения / файла в его окончательном месте я хотел бы проверить mimeType этого файла.
Мой контроллер использует Psr\Http\Message\ServerRequestInterface
и вызывает getUploadedFiles()
, чтобы получить загруженные файлы как экземпляры Psr\Http\Message\UploadedFileInterface
.
На экземпляре этого интерфейса теперь я могу вызвать getClientMediaType()
, чтобы получить тип mime.
Моя проблема в том, что в документации прямо сказано, что нельзя доверять этому значению!
Из-за этого я хотел бы обнаружить mimeType с помощью mime_content_type()
, но я не могу получить фактическое имя файла из этого интерфейса.
Я вижу два варианта:
- я мог бы просто использовать $ _FILES и вызвать mime_content_type ($ _ FILES ['files'] ['tmp_name'])
- я мог бы переместить файл в место, которое я знаю, а затем вызвать mime_content_type (), но это помешало бы НЕ перемещать файл перед проверкой
Вот сокращенная версия моего контроллера:
public function handleUpload(ServerRequestInterface $request, ResponseInterface $response) {
$files = $request->getUploadedFiles();
/** @var UploadedFile $uploadedFile */
$uploadedFile = $files[0];
$fileType = $uploadedFile->getClientMediaType(); // This need to be replaced !
if (!in_array($fileType, self::VALID_IMAGE_MIME_TYPE)) {
// return error
}
// do stuff
}
Есть ли метод, который я не вижу, как получить tmp_name из UploadedFileInterface? Есть ли еще одна лучшая практика для такого рода проверки? Кажется, это очень очевидная проблема, поэтому я думаю, что мне не хватает чего-то простого.