diff --git a/packages/forms/resources/js/components/file-upload.js b/packages/forms/resources/js/components/file-upload.js index bedeb46257..2f51b364f0 100644 --- a/packages/forms/resources/js/components/file-upload.js +++ b/packages/forms/resources/js/components/file-upload.js @@ -58,6 +58,7 @@ export default function fileUploadFormComponent({ maxSize, minSize, maxParallelUploads, + mimeTypeMap, panelAspectRatio, panelLayout, placeholder, @@ -202,9 +203,15 @@ export default function fileUploadFormComponent({ }, fileValidateTypeDetectType: (source, detectedType) => { return new Promise((resolve, reject) => { + const extension = source.name + .split('.') + .pop() + .toLowerCase() const mimeType = + mimeTypeMap[extension] || detectedType || - mime.getType(source.name.split('.').pop()) + mime.getType(extension) + mimeType ? resolve(mimeType) : reject() }) }, diff --git a/packages/forms/resources/views/components/file-upload.blade.php b/packages/forms/resources/views/components/file-upload.blade.php index 1eb56c25d7..39939001b9 100644 --- a/packages/forms/resources/views/components/file-upload.blade.php +++ b/packages/forms/resources/views/components/file-upload.blade.php @@ -81,6 +81,7 @@ maxFiles: @js($getMaxFiles()), maxSize: @js(($size = $getMaxSize()) ? "{$size}KB" : null), minSize: @js(($size = $getMinSize()) ? "{$size}KB" : null), + mimeTypeMap: @js($getMimeTypeMap()), maxParallelUploads: @js($getMaxParallelUploads()), removeUploadedFileUsing: async (fileKey) => { return await $wire.callSchemaComponentMethod( diff --git a/packages/forms/src/Components/FileUpload.php b/packages/forms/src/Components/FileUpload.php index e15c3488e9..46f2cf3081 100644 --- a/packages/forms/src/Components/FileUpload.php +++ b/packages/forms/src/Components/FileUpload.php @@ -77,6 +77,11 @@ class FileUpload extends BaseFileUpload */ protected array | Closure $imageEditorAspectRatios = []; + /** + * @var array | Closure + */ + protected array | Closure $mimeTypeMap = []; + public function appendFiles(bool | Closure $condition = true): static { $this->shouldAppendFiles = $condition; @@ -629,4 +634,22 @@ class FileUpload extends BaseFileUpload ], ]; } + + /** + * @param array | Closure $map + */ + public function mimeTypeMap(array | Closure $map): static + { + $this->mimeTypeMap = $map; + + return $this; + } + + /** + * @return array + */ + public function getMimeTypeMap(): array + { + return $this->evaluate($this->mimeTypeMap); + } } diff --git a/packages/schemas/docs/02-forms/09-file-upload.md b/packages/schemas/docs/02-forms/09-file-upload.md index 381bcdf275..0e1ea0a9ef 100644 --- a/packages/schemas/docs/02-forms/09-file-upload.md +++ b/packages/schemas/docs/02-forms/09-file-upload.md @@ -460,6 +460,24 @@ FileUpload::make('image') ->image() ``` +#### Custom MIME type mapping + +Some file formats may not be recognized correctly by the browser when uploading files. Filament allows you to manually define MIME types for specific file extensions using the `mimeTypeMap()` method: + +```php +use Filament\Forms\Components\FileUpload; + +FileUpload::make('designs') + ->acceptedFileTypes([ + 'x-world/x-3dmf', + 'application/vnd.sketchup.skp', + ]) + ->mimeTypeMap([ + '3dm' => 'x-world/x-3dmf', + 'skp' => 'application/vnd.sketchup.skp', + ]); +``` + ### File size validation You may also restrict the size of uploaded files in kilobytes: diff --git a/packages/tables/resources/lang/bs/table.php b/packages/tables/resources/lang/bs/table.php index ee8eb38953..4b605cc460 100644 --- a/packages/tables/resources/lang/bs/table.php +++ b/packages/tables/resources/lang/bs/table.php @@ -57,6 +57,8 @@ return [ 'filters' => [ + 'heading' => 'Filteri', + 'actions' => [ 'remove' => [