diff --git a/src/Assets/Asset.php b/src/Assets/Asset.php index 060590b8d34..05e7336c130 100644 --- a/src/Assets/Asset.php +++ b/src/Assets/Asset.php @@ -10,7 +10,6 @@ use Statamic\Contracts\Data\Augmentable; use Statamic\Contracts\Data\Augmented; use Statamic\Data\ContainsData; -use Statamic\Data\Data; use Statamic\Data\HasAugmentedInstance; use Statamic\Events\AssetDeleted; use Statamic\Events\AssetSaved; @@ -713,6 +712,16 @@ public function extensionIsOneOf($filetypes = []) return in_array(strtolower($this->extension()), $filetypes); } + /** + * Check if asset's guessed file extension is one of a given list. + * + * @return string + */ + public function guessedExtensionIsOneOf($filetypes = []) + { + return in_array(strtolower($this->guessedExtension()), $filetypes); + } + public function __toString() { return $this->url() ?? $this->id(); diff --git a/src/Fieldtypes/Assets/Assets.php b/src/Fieldtypes/Assets/Assets.php index 7188161fa7a..f812987ef17 100644 --- a/src/Fieldtypes/Assets/Assets.php +++ b/src/Fieldtypes/Assets/Assets.php @@ -173,17 +173,20 @@ public function fieldRules() { return collect(parent::fieldRules())->map(function ($rule) { $name = Str::before($rule, ':'); + $parameters = explode(',', Str::after($rule, ':')); if ($name === 'image') { return new ImageRule(); } if ($name === 'mimes') { - $parameters = explode(',', Str::after($rule, ':')); - return new MimesRule($parameters); } + if ($name === 'mimetypes') { + return new MimetypesRule($parameters); + } + return $rule; })->all(); } diff --git a/src/Fieldtypes/Assets/ImageRule.php b/src/Fieldtypes/Assets/ImageRule.php index 97919cca0ff..ba3f6fb6e36 100644 --- a/src/Fieldtypes/Assets/ImageRule.php +++ b/src/Fieldtypes/Assets/ImageRule.php @@ -24,16 +24,18 @@ public function __construct($parameters = null) */ public function passes($attribute, $value) { - return collect($value)->every(function ($id) { + $extensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'svg', 'webp']; + + return collect($value)->every(function ($id) use ($extensions) { if ($id instanceof UploadedFile) { - return in_array($id->guessExtension(), ['jpg', 'jpeg', 'png', 'gif', 'webp']); + return in_array($id->guessExtension(), $extensions); } if (! $asset = Asset::find($id)) { return false; } - return $asset->isImage(); + return $asset->guessedExtensionIsOneOf($extensions); }); } diff --git a/src/Fieldtypes/Assets/MimesRule.php b/src/Fieldtypes/Assets/MimesRule.php index 1196472e111..441fe7d8c7e 100644 --- a/src/Fieldtypes/Assets/MimesRule.php +++ b/src/Fieldtypes/Assets/MimesRule.php @@ -37,7 +37,7 @@ public function passes($attribute, $value) return false; } - return $asset->extensionIsOneOf($this->parameters); + return $asset->guessedExtensionIsOneOf($this->parameters); }); } diff --git a/src/Fieldtypes/Assets/MimetypesRule.php b/src/Fieldtypes/Assets/MimetypesRule.php new file mode 100644 index 00000000000..d74cb00e174 --- /dev/null +++ b/src/Fieldtypes/Assets/MimetypesRule.php @@ -0,0 +1,48 @@ +parameters = $parameters; + } + + /** + * Determine if the validation rule passes. + * + * @param string $attribute + * @param mixed $value + * @return bool + */ + public function passes($attribute, $value) + { + return collect($value)->every(function ($id) { + if ($id instanceof UploadedFile) { + $mimeType = $id->getMimeType(); + } elseif (! ($mimeType = optional(Asset::find($id))->mimeType())) { + return false; + } + + return in_array($mimeType, $this->parameters) || + in_array(explode('/', $mimeType)[0].'/*', $this->parameters); + }); + } + + /** + * Get the validation error message. + * + * @return string + */ + public function message() + { + return str_replace(':values', join(', ', $this->parameters), __('statamic::validation.mimetypes')); + } +}