Ограничение типов файлов в элементе "база данных"

Ограничение типов файлов в элементе "база данных"

от Виталий Лавров -
Количество ответов: 6
Изображение пользователя Эксперт по Moodle

Нет ли возможности ограничить типы загружаемых файлов?

Может есть патчи или плагины ?

В ответ на Виталий Лавров

Re: Ограничение типов файлов в элементе "база данных"

от Vadim Tabunshchik -
Изображение пользователя Developers

Плагинов не встречал.

Только править код в поле типа "file"

Строка $options->accepted_types = '*';

Вместо * прописать свои типы файлов.

В ответ на Vadim Tabunshchik

Re: Ограничение типов файлов в элементе "база данных"

от Виталий Лавров -
Изображение пользователя Эксперт по Moodle
Да, все оказалось совсем просто. Странно, что эту фичу никто до этого не реализовал.

diff --git a/mod/data/field/file/field.class.php b/mod/data/field/file/field.class.php
index 508613c..d864e1d 100644
--- a/mod/data/field/file/field.class.php
+++ b/mod/data/field/file/field.class.php
@@ -68,7 +68,7 @@ class data_field_file extends data_field_base {
         $options->maxbytes = $this->field->param3;diff --git a/mod/data/field/file/lang/en/datafield_file.php b/mod/data/field/file/lang/en/datafield_file.php
         $options->maxfiles  = 1; // Limit to one file for the moment, this may be changed if requested as a feature in the future.
         $options->itemid    = $itemid;
-        $options->accepted_types = '*';
+        $options->accepted_types = $this->field->param4 ? explode(',',$this->field->param4) : '*';
         $options->return_types = FILE_INTERNAL | FILE_CONTROLLED_LINK;
         $options->context = $PAGE->context;
 
diff --git a/mod/data/field/file/lang/en/datafield_file.php b/mod/data/field/file/lang/en/datafield_file.php
index 4aaa5ba..95528e9 100644
--- a/mod/data/field/file/lang/en/datafield_file.php
+++ b/mod/data/field/file/lang/en/datafield_file.php
@@ -26,4 +26,5 @@
 
 $string['pluginname'] = 'File';
 $string['fieldtypelabel'] = 'File field';
+$string['filetypedescription'] = 'File type';
 $string['privacy:metadata'] = 'The File field component does not store any personal data, it uses tables defined in mod_data.';
diff --git a/mod/data/field/file/mod.html b/mod/data/field/file/mod.html
index 2f67d9a..46afa74 100644
--- a/mod/data/field/file/mod.html
+++ b/mod/data/field/file/mod.html
@@ -22,4 +22,8 @@
             ?>
         </td>
     </tr>
+    <tr>
+        <td class="c0"><label for="param3"><?php echo get_string('filetypedescription', 'datafield_file'); ?></label></td>
+        <td class="c1"><input class="filetypedescription" type="text" name="param4" id="filetype" value="<?php p($this->field->param4);?>" /></td>
+    </tr>
 </table>

В ответ на Виталий Лавров

Re: Ограничение типов файлов в элементе "база данных"

от Vadim Tabunshchik -
Изображение пользователя Developers
Только, наверное:
<td class="c0"><label for="param4">
В ответ на Vadim Tabunshchik

Re: Ограничение типов файлов в элементе "база данных"

от Виталий Лавров -
Изображение пользователя Эксперт по Moodle
Да, есть опечатка, но на работоспособность оно не влияет улыбаюсь
Правда есть еще одно но: разрабы moodle почему-то считают, что более точная информация о типе файле это расширение файла, а не его содержимое.
Исправление 3-х строк в трех файлах позволяет проверять тип файла и адекватно реагировать на несоответствие формата файла.
Если в конфиге есть "$CFG->mimetypestrong", то соответствие типам строгое.
правка lib/filelib.php и upload/lib.php нужна для правильного отображения текста ошибки.
--------------------------
diff --git a/lib/filelib.php b/lib/filelib.php
index d024a58..f8b08f4 100644
--- a/lib/filelib.php
+++ b/lib/filelib.php
@@ -1774,7 +1774,7 @@ function get_mimetype_description($obj, $capitalise=false) {
$mimetype = $obj;
}
$mimetypefromext = mimeinfo('type', $filename);
- if (empty($mimetype) || $mimetypefromext !== 'document/unknown') {
+ if (empty($mimetype) && $mimetypefromext !== 'document/unknown') {
// if file has a known extension, overwrite the specified mimetype
$mimetype = $mimetypefromext;
}
diff --git a/lib/filestorage/file_storage.php b/lib/filestorage/file_storage.php
index 2c1906d..9ad5c8e 100644
--- a/lib/filestorage/file_storage.php
+++ b/lib/filestorage/file_storage.php
@@ -2144,14 +2144,14 @@ class file_storage {
* @return string
*/
public static function mimetype($fullpath, $filename = null) {
+ global $CFG;
if (empty($filename)) {
$filename = $fullpath;
}

// The mimeinfo function determines the mimetype purely based on the file extension.
$type = mimeinfo('type', $filename);
-
- if ($type === 'document/unknown') {
+ if (isset($CFG->mimetypestrong) || $type === 'document/unknown') {
// The type is unknown. Inspect the file now.
$type = self::mimetype_from_file($fullpath);
}
diff --git a/repository/upload/lib.php b/repository/upload/lib.php
index 713ffbd..bdb532e 100644
--- a/repository/upload/lib.php
+++ b/repository/upload/lib.php
@@ -182,7 +182,9 @@ class repository_upload extends repository {
// check filetype
$filemimetype = file_storage::mimetype($_FILES[$elname]['tmp_name'], $record->filename);
if (!in_array($filemimetype, $this->mimetypes)) {
- throw new moodle_exception('invalidfiletype', 'repository', '', get_mimetype_description(array('filename' => $_FILES[$elname]['name'])));
+ throw new moodle_exception('invalidfiletype', 'repository', '',
+ get_mimetype_description(array('filename' => $_FILES[$elname]['name'],
+ 'mimetype'=>$filemimetype)));
}
}
----------------------------------------------------------------------
В ответ на Виталий Лавров

Re: Ограничение типов файлов в элементе "база данных"

от Vadim Tabunshchik -
Изображение пользователя Developers
Виталий, а где вы нашли описание параметра mimetypestrong? Что-то я в 3.8 такого даже в исходниках не нашел.