QFile — компонент библиотеки Quasar, предназначенный для работы с загрузкой файлов в веб-приложениях на Vue.js. Он предоставляет расширенные возможности по выбору, отображению и обработке файлов, интегрируясь с остальными элементами интерфейса Quasar и соблюдая адаптивные стандарты.
v-model Связывает выбранный файл или файлы с
реактивной переменной Vue. Может быть строкой (для одного файла) или
массивом (для нескольких файлов при multiple).
multiple Логическое значение. Позволяет выбирать
несколько файлов одновременно. Если не указано, можно выбрать только
один файл.
accept Определяет допустимые типы файлов, которые
можно выбрать. Принимает MIME-типы или расширения файлов:
accept=".jpg,.png,image/*"label Текстовая метка для кнопки выбора файлов.
Может быть динамической и обновляться в зависимости от состояния
выбора.
counter Показывает количество выбранных файлов при
множественном выборе.
hide-upload-btn Убирает встроенную кнопку загрузки,
позволяя реализовать кастомное оформление кнопки.
clearable Добавляет кнопку для очистки выбранных
файлов.
@added Срабатывает после добавления файлов в
компонент. Возвращает массив файлов.
@removed Срабатывает при удалении файлов из
выбора.
@rejected Срабатывает при попытке добавить файл, не
соответствующий условиям (тип, размер). Возвращает объект с причиной
отклонения.
@uploaded Используется вместе с автоматической
загрузкой через use-upload, сигнализируя об успешной
загрузке на сервер.
QFile позволяет ограничивать размеры и типы файлов для предотвращения ошибок загрузки. Основные свойства для контроля:
max-files — максимальное количество файлов для
множественного выбора.max-file-size — максимальный размер одного файла в
байтах.min-file-size — минимальный размер одного файла в
байтах.filter — функция, позволяющая программно отфильтровать
файлы перед добавлением.Пример ограничения по размеру и типу файла:
<QFile
v-model="files"
multiple
:max-files="5"
:max-file-size="10485760"
accept="image/*"
@rejected="handleRejected"
/>
Функция обработки отклонённых файлов:
function handleRejected(rejectedFiles) {
rejectedFiles.forEach(file => {
console.warn(`Файл ${file.name} не подходит: ${file.__error}`);
});
}
QFile интегрируется с Quasar стилями и позволяет использовать слоты для полного контроля над интерфейсом:
slot="append" — добавление кнопки или иконки
справа.slot="prepend" — добавление элементов слева.slot="file" — кастомное отображение выбранного файла,
включая прогресс загрузки или превью изображения.Пример кастомного отображения файлов:
<QFile v-model="files" multiple>
<template v-slot:file="scope">
<div class="q-pa-xs q-mb-xs">
<q-chip
:label="scope.file.name"
removable
@remove="scope.remove"
/>
</div>
</template>
</QFile>
QFile может работать с FormData для отправки файлов
через HTTP:
function uploadFiles() {
const formData = new FormData();
files.forEach(file => formData.append('files[]', file));
fetch('/upload', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => console.log('Загрузка завершена', data))
.catch(err => console.error('Ошибка загрузки', err));
}
Для автоматической обработки можно использовать
use-upload или создать собственный composable для
управления состоянием загрузки, прогрессом и ошибками.
QImg и QAvatar для мгновенного
отображения выбранного изображения.:hide-upload-btn="true" и кастомного оформления.Пример drag-and-drop:
<QFile
v-model="files"
multiple
hide-upload-btn
class="q-pa-md bg-grey-2"
@added="onFilesAdded"
/>
function onFilesAdded(newFiles) {
newFiles.forEach(file => console.log('Добавлен файл', file.name));
}
QFile в Quasar сочетает удобство выбора и обработки файлов с гибкой кастомизацией интерфейса и полной интеграцией с Vue.js, делая загрузку файлов безопасной, наглядной и контролируемой на всех этапах.