Как отключить проверку расширений по умолчанию в элементе API формы управляемого файла Drupal #?


Я написал функцию проверки, которая проверяет тип файла. Я прокомментировал свои старые валидаторы, чтобы избежать проверки по расширению:

'DownloadFile' => array(
  '#type' => 'managed_file',
  '#title' => t("Download"),
  '#title_display' => 'invisible',
  //'#description' => t('Allowed extensions: pdf zip exe.'),
  '#upload_validators' => array(
    //'file_validate_extensions' => array('pdf zip exe'),
    'file_validate_size' => array(variable_get('mymodule_image_size', 2 * 1024 * 1024)),
  ),
  '#upload_location' => 'public://mymodule/download',
  '#default_value' => $item->DownloadFile,
  '#required' => TRUE,
  '#theme' => 'preview_upload',
),

Теперь, когда я пытаюсь загрузить exe-файл, я получаю:

Указанный файл putty.exe не удалось загрузить. Допускаются только файлы со следующими расширениями: jpg jpeg gif png txt doc xls pdf ppt pps odt ods odp.

Теперь у меня там будут файлы без расширений. И с расширениями, которые я не могу предсказать. И все, что я иногда хочу, - это проверить соответствие правильного типа MIME, иногда даже не точного типа. Итак, как я могу избавиться от проверки расширения и превратить ее в "все идет"?

Мне удалось найти проблему , которая, казалось, касалась этой проблемы, но она говорит unset($element['#upload_validators']['file_validate_extensions']); - для меня это не имеет смысла, так как я создаю совершенно новый массив, и это вообще не установлено.

Я попытался использовать свойство #process, чтобы добавить функцию, которая позже отключит валидаторы по умолчанию, как показано здесь в проблеме, но dpr($element) показывает, что ничего не нужно отменять:

[#upload_validators] => Array
    (
        [file_validate_size] => Array
            (
                [0] => 2097152
            )

    )
Author: Mołot, 2013-09-06

1 answers

Ответ приходит из следующего кода, используемого file_save_upload().

  if (isset($validators['file_validate_extensions'])) {
    if (isset($validators['file_validate_extensions'][0])) {
      // Build the list of non-munged extensions if the caller provided them.
      $extensions = $validators['file_validate_extensions'][0];
    }
    else {
      // If 'file_validate_extensions' is set and the list is empty then the
      // caller wants to allow any extension. In this case we have to remove the
      // validator or else it will reject all extensions.
      unset($validators['file_validate_extensions']);
    }
  }
  else {
    // No validator was provided, so add one using the default list.
    // Build a default non-munged safe list for file_munge_filename().
    $extensions = 'jpg jpeg gif png txt doc xls pdf ppt pps odt ods odp';
    $validators['file_validate_extensions'] = array();
    $validators['file_validate_extensions'][0] = $extensions;
  }

В вашем случае вы должны использовать следующий массив.

  'DownloadFile' => array(
    '#upload_validators' => array(
      'file_validate_extensions' => array(),
      'file_validate_size' => array(variable_get('mymodule_image_size', 2 * 1024 * 1024)),
    ),
  );

Таким образом, $validators['file_validate_extensions'] задано, но $validators['file_validate_extensions'][0] нет. В результате код не будет установлен $extensions, и следующий код также не будет выполнен.

  if (!empty($extensions)) {
    // Munge the filename to protect against possible malicious extension hiding
    // within an unknown file type (ie: filename.html.foo).
    $file->filename = file_munge_filename($file->filename, $extensions);
  }

В коде есть странный способ проверить, пуст ли список; предполагается, что массив пуст, поскольку в нем нет элемента с индексом, равным 0. Я бы предпочел использовать следующий, который не будет делать предположений об используемом более низком индексе массива.

  if (isset($validators['file_validate_extensions'])) {
    if (empty($validators['file_validate_extensions'])) {
      // If 'file_validate_extensions' is set and the list is empty then the
      // caller wants to allow any extension. In this case we have to remove the
      // validator or else it will reject all extensions.
      unset($validators['file_validate_extensions']);
    }
    else {
      // Build the list of non-munged extensions if the caller provided them.
      $extensions = array_shift($validators['file_validate_extensions']);
    }
  }
 2
Author: kiamlaluno, 2013-09-06 15:15:32