diff --git a/src/Forms/FileField.php b/src/Forms/FileField.php index 718f9d385..44e104b85 100644 --- a/src/Forms/FileField.php +++ b/src/Forms/FileField.php @@ -2,10 +2,11 @@ namespace SilverStripe\Forms; +use SilverStripe\Assets\File; +use SilverStripe\Control\HTTP; use SilverStripe\Core\Injector\Injector; use SilverStripe\ORM\DataObject; use SilverStripe\ORM\DataObjectInterface; -use SilverStripe\Assets\File; /** * Represents a file type which can be added to a form. @@ -85,6 +86,43 @@ class FileField extends FormField implements FileHandleField return parent::Field($properties); } + public function getAttributes() + { + $attributes = parent::getAttributes(); + + $accept = $this->getAcceptFileTypes(); + if ($accept) { + $attributes = array_merge(['accept' => implode(',', $accept)], $attributes); + } + + return $attributes; + } + + /** + * Returns a list of file extensions (and corresponding mime types) that will be accepted + * + * @return array + */ + protected function getAcceptFileTypes() + { + $extensions = $this->getValidator()->getAllowedExtensions(); + if (!$extensions) { + return []; + } + + $accept = []; + $mimeTypes = HTTP::config()->uninherited('MimeTypes'); + foreach ($extensions as $extension) { + $accept[] = ".{$extension}"; + // Check for corresponding mime type + if (isset($mimeTypes[$extension])) { + $accept[] = $mimeTypes[$extension]; + } + } + + return array_unique($accept); + } + /** * @param DataObject|DataObjectInterface $record */ diff --git a/tests/php/Forms/FileFieldTest.php b/tests/php/Forms/FileFieldTest.php index 6089f4c6c..0cae51c1a 100644 --- a/tests/php/Forms/FileFieldTest.php +++ b/tests/php/Forms/FileFieldTest.php @@ -2,6 +2,7 @@ namespace SilverStripe\Forms\Tests; +use ReflectionMethod; use SilverStripe\Dev\FunctionalTest; use SilverStripe\Control\Controller; use SilverStripe\Forms\FileField; @@ -11,7 +12,6 @@ use SilverStripe\Forms\RequiredFields; class FileFieldTest extends FunctionalTest { - /** * Test a valid upload of a required file in a form. Error is set to 0, as the upload went well * @@ -39,6 +39,24 @@ class FileFieldTest extends FunctionalTest $this->assertTrue($form->validationResult()->isValid()); } + /** + * @skipUpgrade + */ + public function testGetAcceptFileTypes() + { + $field = new FileField('image', 'Image'); + $field->setAllowedExtensions('jpg', 'png'); + + $method = new ReflectionMethod($field, 'getAcceptFileTypes'); + $method->setAccessible(true); + $allowed = $method->invoke($field); + + $expected = ['.jpg', '.png', 'image/jpeg', 'image/png']; + foreach ($expected as $extensionOrMime) { + $this->assertContains($extensionOrMime, $allowed); + } + } + /** * Test different scenarii for a failed upload : an error occured, no files where provided * @skipUpgrade