Как отключить проверку расширений по умолчанию в элементе 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
)
)
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']);
}
}