Как добавить загрузку файла¶
Загрузка файлов¶
Добавлять загрузку файлов можно в схемах страниц, конфигурации, плагинов и тем. Загрузка файлов всегда выполняется через Ajax и позволяет перетаскивать файлы с рабочего стола или выбирать их как в обычных полях файлов. Каждый раз, когда файл добавляется в поле, он автоматически загружается во временную папку и сохраняется только при выполнении действия Save (или Submit).
Пример использования:
Предупреждение
Чтобы добавить загрузку файла, в базовом шаблоне Twig должна быть команда вывода javascript внизу: {{ assets.js('bottom') }}.
Параметры¶
У поля файла есть множество параметров: от допустимого MIME-типа или расширения до разрешённого размера файла:
Значения по умолчанию¶
multiple¶
Как и обычное HTML5-поле файла, при включённом параметре multiple оно позволяет загрузить больше одного файла. Этот параметр также связан с параметром limit, который определяет, сколько из нескольких файлов разрешено для поля.
destination¶
Destination — место, где должны храниться загруженные файлы. Это может быть обычный path (относительно корня Grav), stream (например, theme://images), self@ или специальный префикс page@:. Также можно указать подпапку относительно текущей страницы с помощью self@/path.
Внимание
self@ не допускается вне области страниц или Flex-объектов — будет выброшена ошибка. Если вы используете поле файла вне страницы или Flex-объекта, всегда меняйте параметр destination.
Примеры¶
- Если нужно загружать файлы в папку плагина
testing(user/plugins/testing), destination будет таким:
- Предположим, у нас есть элемент блога по маршруту
/blog/ajax-upload(физическиuser/pages/02.blog/ajax-upload); с префиксомpage@:destination будет таким:
- Предположим, текущая тема —
antimatter, и мы хотим загружать файлы в папку assets (физическиuser/themes/antimatter/assets); с потокомthemedestination будет таким:
random_name¶
Когда random_name включён, загруженный файл переименовывается в случайную строку длиной 15 символов. Это полезно, если вы хотите хэшировать загружаемые файлы или ищете способ уменьшить коллизии имён.
Пример¶
avoid_overwriting¶
Когда avoid_overwriting включён и файл с тем же именем, что и загружаемый, уже существует в destination, он будет переименован. К имени нового загруженного файла будет добавлен префикс из текущей даты и времени, соединённых дефисом.
Пример¶
limit¶
Когда параметр multiple включён, limit позволяет ограничить число разрешённых файлов для отдельного поля. Если multiple не включён (по умолчанию он выключен), limit автоматически принимает значение 1.
Если limit равен 0, это означает отсутствие ограничений на количество загружаемых файлов.
Внимание
Хорошей практикой считается всегда задавать ограничение на количество загружаемых файлов. Так вы лучше контролируете использование ресурсов сервера.
accept¶
Параметр accept принимает массив MIME-типов, а также определения расширений. Все расширения должны начинаться с . (точки), за которой следует само расширение.
Кроме того, разрешить любой файл можно с помощью звёздочки __*__: accept: ['*'].
Примеры¶
- Разрешить только файлы
yamlиjson:
- Разрешить только изображения и видео:
- Разрешить любые изображения, любые видео и только файлы mp3:
- Разрешить любой файл:
filesize¶
Максимальный размер файла ограничивается:
-
параметром
filesize:на уровне поля; затем… -
параметром
files: filesize:в конфигурации плагина Form (user/plugins/form.yaml); затем, если ни один из них не ограничивает… -
конфигурацией PHP:
upload_max_filesizeдля отдельных загружаемых файлов иpost_max_sizeдля максимального общего размера POST-запроса формы.
Примеры¶
- Ограничить конкретное поле до
5M:
- Ограничить все поля файлов до
5M: отредактируйте файлuser/config/form.yaml:
allow_extensions¶
В Admin2 поля файлов загружают данные через API, который по умолчанию запрещает содержимое страниц (.md, .markdown) и таблицы стилей (.css, .scss, .sass, .less), поскольку иначе учётная запись с правом загрузки медиа могла бы записывать или удалять эти файлы где угодно в user/. Разработчик может разрешить их для конкретного поля, перечислив их в allow_extensions. Требуются API 1.0.38 и Admin2 2.1.21.
Пример¶
Примечание
API читает allow_extensions из схемы на сервере, а не из запроса на загрузку, и применяет его только когда загрузка идёт в собственный destination этого поля. Разрешить можно только md, markdown, css, scss, sass и less. Опасные расширения вроде php, форматы конфигурации вроде yaml, json и twig, правило «только изображения» для user/accounts/ и блокировка user/config/ действуют всегда. Какие файлы принимает поле, по-прежнему решает accept, поэтому укажите расширение и там.
### Устаревшая обработка загрузки файлов и ручное управление
Для базовой обработки файлов достаточно определения поля. Файлы загружаются во временное место через виджет Dropzone с помощью XHR-запроса к серверу. При отправке формы файлы автоматически перемещаются из временного места в окончательное. Однако можно использовать действие upload: true в блоке process:, чтобы вручную указать, на каком этапе рабочего процесса должны перемещаться эти файлы.