diff --git a/file_entity.module b/file_entity.module index 36f8283..881a2cf 100644 --- a/file_entity.module +++ b/file_entity.module @@ -2455,6 +2455,21 @@ function file_entity_match_mimetypes($needle, $haystack) { } /** + * Convert an array of extensions to MIME types. + */ +function file_entity_get_mimetypes_from_extensions(array $extensions) { + include_once DRUPAL_ROOT . '/includes/file.mimetypes.inc'; + $mapping = file_mimetype_mapping(); + $mimetypes = array(); + foreach ($extensions as $extension) { + if (isset($mapping['extensions'][$extension])) { + $mimetypes[] = $mapping['mimetypes'][$mapping['extensions'][$extension]]; + } + } + return array_unique($mimetypes); +} + +/** * A wrapper function for the PHP function fnmatch(). * * We include this, because Windows servers do not implement fnmatch() until @@ -2600,3 +2615,24 @@ function file_entity_features_pipe_file_type_alter(&$pipe, $data, $export) { $pipe['variable'][] = "pathauto_file_{$file_type}_pattern"; } } + +/** + * Implements hook_element_info_alter(). + */ +function file_entity_element_info_alter(&$info) { + $info['managed_file']['#process'][] = 'file_entity_managed_file_process_accept_attribute'; +} + +/** + * Element process for managed_file to add 'accept' attributes for allowed extensions. + * + * Add the allowed extensions as an 'accept' attribute to the file_managed element. + */ +function file_entity_managed_file_process_accept_attribute($element, &$form_state, $form) { + if (!empty($element['#upload_validators']['file_validate_extensions']) && !isset($element['upload']['#attributes']['accept'])) { + $extensions = explode(' ', $element['#upload_validators']['file_validate_extensions'][0]); + $element['upload']['#attributes']['accept'] = '.' . implode(',.', $extensions); + } + + return $element; +} diff --git a/file_entity.test b/file_entity.test index 085ced5..37fa2b8 100644 --- a/file_entity.test +++ b/file_entity.test @@ -298,6 +298,21 @@ class FileEntityUnitTestCase extends FileEntityTestHelper { file_delete($file, TRUE); $this->assertFalse(db_query('SELECT COUNT(*) FROM {file_metadata} WHERE fid = :fid', array(':fid' => 'fid'))->fetchField(), 'Row deleted in {file_metadata} on file_delete().'); } + + /** + * Test file_entity_get_mimetypes_from_extensions(). + */ + function testGetMimetypesFromExtensions() { + $tests = array(); + $tests[] = array( + 'extensions' => array('png', 'jpg', 'jpeg', 'gif'), + 'mimetypes' => array('image/png', 'image/jpeg', 'image/gif'), + ); + foreach ($tests as $test) { + $result = file_entity_get_mimetypes_from_extensions($test['extensions']); + $this->assertEqual($test['mimetypes'], $result); + } + } } /**