name: FileValidator class_comment: '# * @author Bernhard Schussek ' dependencies: - name: FileObject type: class source: Symfony\Component\HttpFoundation\File\File - name: UploadedFile type: class source: Symfony\Component\HttpFoundation\File\UploadedFile - name: MimeTypes type: class source: Symfony\Component\Mime\MimeTypes - name: Constraint type: class source: Symfony\Component\Validator\Constraint - name: ConstraintValidator type: class source: Symfony\Component\Validator\ConstraintValidator - name: LogicException type: class source: Symfony\Component\Validator\Exception\LogicException - name: UnexpectedTypeException type: class source: Symfony\Component\Validator\Exception\UnexpectedTypeException - name: UnexpectedValueException type: class source: Symfony\Component\Validator\Exception\UnexpectedValueException properties: [] methods: - name: factorizeSizes visibility: private parameters: - name: size - name: limit - name: binaryFormat comment: "# * @author Bernhard Schussek \n# */\n# class FileValidator\ \ extends ConstraintValidator\n# {\n# public const KB_BYTES = 1000;\n# public\ \ const MB_BYTES = 1000000;\n# public const KIB_BYTES = 1024;\n# public const\ \ MIB_BYTES = 1048576;\n# \n# private const SUFFICES = [\n# 1 => 'bytes',\n# self::KB_BYTES\ \ => 'kB',\n# self::MB_BYTES => 'MB',\n# self::KIB_BYTES => 'KiB',\n# self::MIB_BYTES\ \ => 'MiB',\n# ];\n# \n# public function validate(mixed $value, Constraint $constraint):\ \ void\n# {\n# if (!$constraint instanceof File) {\n# throw new UnexpectedTypeException($constraint,\ \ File::class);\n# }\n# \n# if (null === $value || '' === $value) {\n# return;\n\ # }\n# \n# if ($value instanceof UploadedFile && !$value->isValid()) {\n# switch\ \ ($value->getError()) {\n# case \\UPLOAD_ERR_INI_SIZE:\n# $iniLimitSize = UploadedFile::getMaxFilesize();\n\ # if ($constraint->maxSize && $constraint->maxSize < $iniLimitSize) {\n# $limitInBytes\ \ = $constraint->maxSize;\n# $binaryFormat = $constraint->binaryFormat;\n# } else\ \ {\n# $limitInBytes = $iniLimitSize;\n# $binaryFormat = $constraint->binaryFormat\ \ ?? true;\n# }\n# \n# [, $limitAsString, $suffix] = $this->factorizeSizes(0,\ \ $limitInBytes, $binaryFormat);\n# $this->context->buildViolation($constraint->uploadIniSizeErrorMessage)\n\ # ->setParameter('{{ limit }}', $limitAsString)\n# ->setParameter('{{ suffix }}',\ \ $suffix)\n# ->setCode((string) \\UPLOAD_ERR_INI_SIZE)\n# ->addViolation();\n\ # \n# return;\n# case \\UPLOAD_ERR_FORM_SIZE:\n# $this->context->buildViolation($constraint->uploadFormSizeErrorMessage)\n\ # ->setCode((string) \\UPLOAD_ERR_FORM_SIZE)\n# ->addViolation();\n# \n# return;\n\ # case \\UPLOAD_ERR_PARTIAL:\n# $this->context->buildViolation($constraint->uploadPartialErrorMessage)\n\ # ->setCode((string) \\UPLOAD_ERR_PARTIAL)\n# ->addViolation();\n# \n# return;\n\ # case \\UPLOAD_ERR_NO_FILE:\n# $this->context->buildViolation($constraint->uploadNoFileErrorMessage)\n\ # ->setCode((string) \\UPLOAD_ERR_NO_FILE)\n# ->addViolation();\n# \n# return;\n\ # case \\UPLOAD_ERR_NO_TMP_DIR:\n# $this->context->buildViolation($constraint->uploadNoTmpDirErrorMessage)\n\ # ->setCode((string) \\UPLOAD_ERR_NO_TMP_DIR)\n# ->addViolation();\n# \n# return;\n\ # case \\UPLOAD_ERR_CANT_WRITE:\n# $this->context->buildViolation($constraint->uploadCantWriteErrorMessage)\n\ # ->setCode((string) \\UPLOAD_ERR_CANT_WRITE)\n# ->addViolation();\n# \n# return;\n\ # case \\UPLOAD_ERR_EXTENSION:\n# $this->context->buildViolation($constraint->uploadExtensionErrorMessage)\n\ # ->setCode((string) \\UPLOAD_ERR_EXTENSION)\n# ->addViolation();\n# \n# return;\n\ # default:\n# $this->context->buildViolation($constraint->uploadErrorMessage)\n\ # ->setCode((string) $value->getError())\n# ->addViolation();\n# \n# return;\n\ # }\n# }\n# \n# if (!\\is_scalar($value) && !$value instanceof FileObject && !$value\ \ instanceof \\Stringable) {\n# throw new UnexpectedValueException($value, 'string');\n\ # }\n# \n# $path = $value instanceof FileObject ? $value->getPathname() : (string)\ \ $value;\n# \n# if (!is_file($path)) {\n# $this->context->buildViolation($constraint->notFoundMessage)\n\ # ->setParameter('{{ file }}', $this->formatValue($path))\n# ->setCode(File::NOT_FOUND_ERROR)\n\ # ->addViolation();\n# \n# return;\n# }\n# \n# if (!is_readable($path)) {\n# $this->context->buildViolation($constraint->notReadableMessage)\n\ # ->setParameter('{{ file }}', $this->formatValue($path))\n# ->setCode(File::NOT_READABLE_ERROR)\n\ # ->addViolation();\n# \n# return;\n# }\n# \n# $sizeInBytes = filesize($path);\n\ # $basename = $value instanceof UploadedFile ? $value->getClientOriginalName()\ \ : basename($path);\n# \n# if ($constraint->filenameMaxLength && $constraint->filenameMaxLength\ \ < $filenameLength = \\strlen($basename)) {\n# $this->context->buildViolation($constraint->filenameTooLongMessage)\n\ # ->setParameter('{{ filename_max_length }}', $this->formatValue($constraint->filenameMaxLength))\n\ # ->setCode(File::FILENAME_TOO_LONG)\n# ->setPlural($constraint->filenameMaxLength)\n\ # ->addViolation();\n# \n# return;\n# }\n# \n# if (0 === $sizeInBytes) {\n# $this->context->buildViolation($constraint->disallowEmptyMessage)\n\ # ->setParameter('{{ file }}', $this->formatValue($path))\n# ->setParameter('{{\ \ name }}', $this->formatValue($basename))\n# ->setCode(File::EMPTY_ERROR)\n#\ \ ->addViolation();\n# \n# return;\n# }\n# \n# if ($constraint->maxSize) {\n#\ \ $limitInBytes = $constraint->maxSize;\n# \n# if ($sizeInBytes > $limitInBytes)\ \ {\n# [$sizeAsString, $limitAsString, $suffix] = $this->factorizeSizes($sizeInBytes,\ \ $limitInBytes, $constraint->binaryFormat);\n# $this->context->buildViolation($constraint->maxSizeMessage)\n\ # ->setParameter('{{ file }}', $this->formatValue($path))\n# ->setParameter('{{\ \ size }}', $sizeAsString)\n# ->setParameter('{{ limit }}', $limitAsString)\n\ # ->setParameter('{{ suffix }}', $suffix)\n# ->setParameter('{{ name }}', $this->formatValue($basename))\n\ # ->setCode(File::TOO_LARGE_ERROR)\n# ->addViolation();\n# \n# return;\n# }\n\ # }\n# \n# $mimeTypes = (array) $constraint->mimeTypes;\n# \n# if ($constraint->extensions)\ \ {\n# $fileExtension = strtolower(pathinfo($basename, \\PATHINFO_EXTENSION));\n\ # \n# $found = false;\n# $normalizedExtensions = [];\n# foreach ((array) $constraint->extensions\ \ as $k => $v) {\n# if (!\\is_string($k)) {\n# $k = $v;\n# $v = null;\n# }\n#\ \ \n# $normalizedExtensions[] = $k;\n# \n# if ($fileExtension !== $k) {\n# continue;\n\ # }\n# \n# $found = true;\n# if (null === $v) {\n# if (!class_exists(MimeTypes::class))\ \ {\n# throw new LogicException('You cannot validate the mime-type of files as\ \ the Mime component is not installed. Try running \"composer require symfony/mime\"\ .');\n# }\n# \n# $mimeTypesHelper = MimeTypes::getDefault();\n# $v = $mimeTypesHelper->getMimeTypes($k);\n\ # }\n# \n# $mimeTypes = $mimeTypes ? array_intersect($v, $mimeTypes) : (array)\ \ $v;\n# break;\n# }\n# \n# if (!$found) {\n# $this->context->buildViolation($constraint->extensionsMessage)\n\ # ->setParameter('{{ file }}', $this->formatValue($path))\n# ->setParameter('{{\ \ extension }}', $this->formatValue($fileExtension))\n# ->setParameter('{{ extensions\ \ }}', $this->formatValues($normalizedExtensions))\n# ->setParameter('{{ name\ \ }}', $this->formatValue($basename))\n# ->setCode(File::INVALID_EXTENSION_ERROR)\n\ # ->addViolation();\n# }\n# }\n# \n# if ($mimeTypes) {\n# if ($value instanceof\ \ FileObject) {\n# $mime = $value->getMimeType();\n# } elseif (isset($mimeTypesHelper)\ \ || class_exists(MimeTypes::class)) {\n# $mime = ($mimeTypesHelper ?? MimeTypes::getDefault())->guessMimeType($path);\n\ # } elseif (!class_exists(FileObject::class)) {\n# throw new LogicException('You\ \ cannot validate the mime-type of files as the Mime component is not installed.\ \ Try running \"composer require symfony/mime\".');\n# } else {\n# $mime = (new\ \ FileObject($value))->getMimeType();\n# }\n# \n# foreach ($mimeTypes as $mimeType)\ \ {\n# if ($mimeType === $mime) {\n# return;\n# }\n# \n# if ($discrete = strstr($mimeType,\ \ '/*', true)) {\n# if (strstr($mime, '/', true) === $discrete) {\n# return;\n\ # }\n# }\n# }\n# \n# $this->context->buildViolation($constraint->mimeTypesMessage)\n\ # ->setParameter('{{ file }}', $this->formatValue($path))\n# ->setParameter('{{\ \ type }}', $this->formatValue($mime))\n# ->setParameter('{{ types }}', $this->formatValues($mimeTypes))\n\ # ->setParameter('{{ name }}', $this->formatValue($basename))\n# ->setCode(File::INVALID_MIME_TYPE_ERROR)\n\ # ->addViolation();\n# }\n# }\n# \n# private static function moreDecimalsThan(string\ \ $double, int $numberOfDecimals): bool\n# {\n# return \\strlen($double) > \\\ strlen(round($double, $numberOfDecimals));\n# }\n# \n# /**\n# * Convert the limit\ \ to the smallest possible number\n# * (i.e. try \"MB\", then \"kB\", then \"\ bytes\")." traits: - Symfony\Component\HttpFoundation\File\UploadedFile - Symfony\Component\Mime\MimeTypes - Symfony\Component\Validator\Constraint - Symfony\Component\Validator\ConstraintValidator - Symfony\Component\Validator\Exception\LogicException - Symfony\Component\Validator\Exception\UnexpectedTypeException - Symfony\Component\Validator\Exception\UnexpectedValueException interfaces: []