Skip to content

CdsUploader

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

Storybook GitLab Figma
Покрытие тестами: 97% — хорошее покрытие
API в спеках
77 / 77 пропсы, события, слоты и exposed, у которых есть тест
Тест-кейсы
102 юнит · 3 браузерных · 2 в планах
Известные баги
18 зафиксированы тестом it.fails
Покрытие кода
96.8% строк · 84.7% ветвей замер v4.0.0-alpha.13
A11y (axe)
27 рекомендаций в 14 историях замер v4.0.0-alpha.11

Загрузчик сам отправляет файлы по HTTP. Если файлы нужно только выбрать и отправить вместе с формой — возьмите поле CdsFileInput, а для зоны перетаскивания с превью изображений — CdsFileUpload.

Анатомия ​

Первая схема — каркас: лейбл, описание, кнопка загрузки и сообщения. Вторая — элемент списка файлов во время загрузки: статус, имя-ссылка, действия и полоса прогресса.

Вариации ​

Кнопка загрузки ​

По умолчанию загрузку запускает primary-кнопка «Загрузить файл» с иконкой upload-icon. Свойство button-props передаёт кнопке любые свойства CdsButton, а слот default заменяет её целиком — готовые пропсы кнопки приходят в параметре слота props.

Sandbox Storybook

Разрешённые типы файлов ​

Свойство accept ограничивает выбор в системном диалоге и отфильтровывает неподходящие файлы при перетаскивании — отклонённые приходят в событии reject.

Sandbox Storybook

Список файлов ​

Список загруженных файлов живёт в v-model — положите туда файлы, полученные с сервера, и они отобразятся сразу. Свойство show-upload-list управляет списком: false скрывает его целиком, объект — включает иконки скачивания и удаления.

Sandbox Storybook

Количество файлов ​

Свойство max-count ограничивает длину списка: при max-count="1" новый файл заменяет предыдущий, при большем лимите лишние файлы отбрасываются.

Sandbox Storybook

Загрузка директорий ​

Свойство directory включает выбор папки целиком — файлы собираются из неё рекурсивно, в том числе при перетаскивании.

Sandbox Storybook

Состояния ​

disabled блокирует кнопку и убирает иконки удаления из списка, readonly запрещает менять список, но оставляет скачивание.

Sandbox Storybook

Слоты ​

Когда пропсов недостаточно, содержимое любого блока заменяется слотом.

Имя слотаОписание
labelСодержимое лейбла (замещает label)
descriptionСодержимое описания (замещает description)
prependЭлемент перед кнопкой загрузки
defaultСвоя кнопка загрузки; получает готовые props для CdsButton
appendЭлемент после кнопки загрузки
messagesСодержимое блока сообщений
itemRenderСвой рендер элемента списка; получает file, fileList и actions
Sandbox Storybook

Рекомендации ​

Сценарии использования ​

Отложенная отправка ​

Хук before-upload, возвращающий false, отключает автоматическую отправку: файлы копятся в списке, а загрузку запускает отдельная кнопка в слоте append — например, вместе с отправкой всей формы.

Sandbox Storybook

Проверка перед загрузкой ​

Тот же before-upload — точка для валидации: верните false, и файл не уйдёт на сервер. Отклонённый файл всё равно попадает в список — уберите его в обработчике change, а причину покажите через error-messages.

Sandbox Storybook

Ошибки загрузки ​

Файл, который сервер отклонил, остаётся в списке со статусом ошибки. Свойство show-tooltip-with-error показывает ответ сервера в тултипе у статуса, а событие error даёт собрать сообщения под полем — здесь они копятся в error-messages и сбрасываются при удалении файла.

Sandbox Storybook

Загрузка без сервера ​

Свойство custom-request заменяет встроенный XHR-транспорт своей функцией: она получает файл и колбэки onProgress, onSuccess, onError, а возвращает объект с методом abort. Здесь загрузка имитируется таймером — так же можно отправлять файлы через SDK или WebSocket.

Sandbox Storybook

События ​

Компонент сообщает о каждом шаге: change — любое изменение списка, progress, success и error — ход загрузки, remove, drop, reject, download, preview — действия пользователя. Откройте консоль, чтобы увидеть их.

Sandbox Storybook

API ​

Пропсы

ИмяТипПо умолчаниюОписание
acceptstring | string[] | undefined''Типы разрешённых файлов
actionNUploader.TAction | undefined''URL, куда загружать файлы
activeColorstring | undefined—Цвет компонента, когда он находится в активном состоянии
appendIconIconValue | undefined—Иконка в слоте append после контента
baseColorstring | undefined—Цвет неактивного компонента
beforeUpload((file: NUploader.IUploadFile<any>, fileList: NUploader.IUploadFile<any>[]) => NUploader.TBeforeUploadFileType | Promise<void | NUploader.TBeforeUploadFileType>) | undefined—Хук жизненного цикла перед загрузкой файла
bgColorstring | undefined—Цвет фона компонента
buttonPropsPartial<CdsButtonProps> | undefinednullСвойства для компонента CdsButton
captureboolean | "user" | "environment" | undefined—Тип носителя, откуда захватывать файл для загрузки на мобильных устройствах
centerAffixboolean | undefinedtrueВыровнять по вертикали элементы appendInner, prependInner, clearIcon и label по центру.
colorstring | undefined—Цвет компонента
customRequest((options: NUploader.IUploadRequestOption<any>) => void) | undefined—Собственный запрос на загрузку файла. Переопределяет xhr по умолчанию
dataRecord<string, unknown> | ((file: string | Blob | NUploader.IRcFile) => Record<string, unknown>) | {} | undefined{}Параметры загрузки файла или функция, возвращающая параметры загрузки файла
defaultFileListNUploader.IUploadFile<any>[] | undefined—Список файлов по умолчанию
descriptionstring | undefined—Описание компонента, отображаемое под меткой
direction"horizontal" | "vertical" | undefined'horizontal'Переключение между горизонтальным или вертикальным отображением.
directoryboolean | undefined—Загружать директории
disabledboolean | null | undefinednullЗаблокированное состояние
downloadIconIconValue | undefined'download'Иконка скачивания файла
errorboolean | undefined—Отображает компонент в состояние ошибки
errorMessagesstring | readonly string[] | null | undefined[]Отображает компонент в состояние ошибки и передает пользовательские сообщения об ошибках. Будет объединяться с любыми проверками, заданными в свойстве rules. Это поле не запускает валидацию.
focusedboolean | undefined—Управляет состоянием фокуса компонента. Когда true, компонент считается сфокусированным и может применять соответствующие стили или поведение.
headersNUploader.TUploadRequestHeaders | undefined—Заголовки запроса
hideDetailsboolean | "auto" | undefined—Скрытие блока с деталями (сообщениями и подсказками). При значении 'auto' блок скрывается, если нет сообщений
hideMessagesboolean | undefined—Скрыть сообщения под полем ввода
hintstring | undefined—Текст подсказки, отображаемый под полем ввода
iconColorstring | boolean | undefined—Цвет иконки. Принимает булево значение или строку с цветом
idstring | undefined—Уникальный идентификатор компонента
isImageUrl((file: NUploader.IUploadFile<any>) => boolean) | undefined—Настройка отображения миниатюр загружаемых файлов (пока не поддерживается)
itemRenderNUploader.TItemRender<any> | undefined—Функция рендера для отображения элемента списка загружаемых файлов
labelstring | undefined—Текст метки (label) компонента
listTypeNUploader.TUploadListType | undefined'text'Тип списка загружаемых файлов (поддерживается только 'text')
maxCountnumber | undefined—Максимальное количество загружаемых файлов
maxErrorsstring | number | undefined1Максимальное число отображаемых ошибок при валидации
maxWidthstring | number | undefined—Максимальная ширина компонента
messagesstring | readonly string[] | undefined[]Сообщения для отображения под полем ввода
methodNUploader.TUploadRequestMethod | undefined—Тип http-запроса для загрузки файлов
minWidthstring | number | undefined—Минимальная ширина компонента
modelValueany—Значение компонента в v-model. Если компонент поддерживает свойство multiple, по умолчанию используется пустой массив.
multipleboolean | undefinedtrueМножественная загрузка файлов
namestring | undefined—Имя поля ввода
openFileDialogOnClickboolean | undefined—Открывать ли системное окно при клике на загрузчик файлов
persistentHintboolean | undefined—Всегда отображать подсказку, а не только при фокусе
prependIconIconValue | undefined—Иконка в слоте prepend перед контентом
readonlyboolean | null | undefinednullТолько для чтения
removeIconIconValue | undefined'delete'Иконка удаления файла
rulesreadonly ValidationRule[] | undefined[]Принимает массив, состоящий из элементов различных типов: функций, логических значений и строк. Функции принимают входное значение в качестве аргумента и должны возвращать либо true / false, либо строку, содержащую сообщение об ошибке. Поле ввода перейдет в состояние ошибки, если функция возвращает значение false (или любое значение в массиве содержит false) либо является строкой.
showTooltipWithErrorboolean | undefinedfalseПоказывать ли тултип с ошибкой возле каждого файла
showUploadListboolean | NUploader.TShowUploadList | undefinedtrueПоказывать список загруженных файлов
sizenumber | "xs" | "sm" | "md" | "lg" | "xl" | undefined'md'Размер компонента
tagstring | JSXComponent<any> | undefined'span'Пользовательский HTML-тег для отображения
textColorstring | undefined—Цвет текста компонента
themestring | undefined—Тема компонента
uploadIconIconValue | undefined'upload'Иконка загрузки файла
validateOnValidateOn | undefined—Изменяет тип события, при котором запускается валидация
validationValueany—Значение, используемое при применении правил валидации
widthstring | number | undefined—Ширина компонента
withCredentialsboolean | undefined—Запрос с передачей cookie

События

ИмяТипОписание
change[info: NUploader.IUploadChangeParam<NUploader.IUploadFile<any>>]Событие изменения поля ввода
download[file: NUploader.IUploadFile<any>]Событие при скачивании файла
drop[event: DragEvent]Событие при drag-n-drop файла
error[error: ProgressEvent<EventTarget> | NUploader.IUploadRequestError, response: any, file: NUploader.IUploadFile<any>]Событие ошибки загрузки файла
preview[file: NUploader.IUploadFile<any>]Событие при просмотре превью файла
progress[event: { percent: number; } | undefined, file: NUploader.IUploadFile<any>]Событие процесса загрузки файла
reject[fileList: NUploader.IUploadFile<any>[]]Событие при отклонении загрузки файла
remove[file: NUploader.IUploadFile<any>]Событие при удалении файла
success[response: Record<string, unknown>, file: NUploader.IUploadFile<any>]Событие успешной загрузки файла
update:modelValue[fileList: NUploader.IUploadFile<any>[]]Событие при изменении значения (v-model)

Слоты

ИмяТипОписание
appendanyКонтент в слоте append после кнопки загрузки.
default{ props: Partial<CdsButtonProps>; }Кнопка/активатор загрузки. Получает props для CdsButton.
descriptionanyОписание под меткой.
itemRender{ originNode: VNode<RendererNode, RendererElement, { [key: string]: any; }>; file?: NUploader.IUploadFile<any> | undefined; fileList?: NUploader.IUploadFile<any>[] | undefined; actions: { download?: (() => void) | undefined; preview?: (() => void) | undefined; remove?: (() => void) | undefined; }; }Кастомный рендер элемента списка загружаемых файлов.
labelanyМетка (label) поля загрузки.
messagesanyСообщения подсказки/ошибки.
prependanyКонтент в слоте prepend перед кнопкой загрузки.

Exposed

ИмяТипОписание
fileListNUploader.IUploadFile<any>[]Текущий список файлов со статусами загрузки.
uploadRefNUploader.IUploaderRef | undefinedСсылка на внутренний элемент загрузки — даёт доступ к программному выбору файлов и прерыванию.