Skip to content

Upload ​

Загрузка файлов с drag-and-drop, отслеживанием прогресса, предпросмотром изображений и несколькими стилями списков.

vue
<script setup lang="ts">
import { ref } from 'vue'
import { VxUpload } from 'veloxui'
import type { UploadFile } from 'veloxui'

const files = ref<UploadFile[]>([])
</script>

<template>
  <VxUpload v-model="files" action="/api/upload" />
</template>

Drag and Drop ​

Включите drag для области drop-зоны. Пользователи могут перетаскивать файлы в зону или кликнуть для выбора.

Drop files here or click to browse
Supports JPG, PNG, GIF up to 10MB
vue
<script setup lang="ts">
import { ref } from 'vue'
import type { UploadFile } from 'veloxui'

const files = ref<UploadFile[]>([])
</script>

<template>
  <VxUpload
    v-model="files"
    action="/api/upload"
    drag
    multiple
    tip="Supports JPG, PNG, GIF up to 10MB"
  />
</template>

Picture List ​

Установите list-type="picture", чтобы показывать миниатюры рядом с именами файлов.

vue
<script setup lang="ts">
import { ref } from 'vue'
import type { UploadFile } from 'veloxui'

const files = ref<UploadFile[]>([])
</script>

<template>
  <VxUpload
    v-model="files"
    action="/api/upload"
    list-type="picture"
    multiple
    accept="image/*"
  />
</template>

Picture Card ​

Установите list-type="picture-card" для сетки карточек с изображениями и действиями при наведении (предпросмотр и удаление).

vue
<script setup lang="ts">
import { ref } from 'vue'
import type { UploadFile } from 'veloxui'

const files = ref<UploadFile[]>([
  { uid: '1', name: 'photo.jpg', status: 'success', url: 'https://picsum.photos/200/200?1' },
  { uid: '2', name: 'avatar.png', status: 'success', url: 'https://picsum.photos/200/200?2' },
])
</script>

<template>
  <VxUpload
    v-model="files"
    action="/api/upload"
    list-type="picture-card"
    multiple
    accept="image/*"
    :limit="6"
  />
</template>

Multiple Files ​

Включите multiple, чтобы разрешить выбор нескольких файлов сразу.

vue
<script setup lang="ts">
import { ref } from 'vue'
import type { UploadFile } from 'veloxui'

const files = ref<UploadFile[]>([])
</script>

<template>
  <VxUpload v-model="files" action="/api/upload" multiple />
</template>

File Limit ​

Установите limit, чтобы ограничить число файлов. Событие exceed срабатывает при попытке добавить больше.

Maximum 3 files
vue
<script setup lang="ts">
import { ref } from 'vue'
import type { UploadFile } from 'veloxui'

const files = ref<UploadFile[]>([])

function handleExceed(files: File[], limit: number) {
  alert(`You can only upload ${limit} files.`)
}
</script>

<template>
  <VxUpload
    v-model="files"
    action="/api/upload"
    multiple
    :limit="3"
    @exceed="handleExceed"
    tip="Maximum 3 files"
  />
</template>

Max File Size ​

Установите max-size (в КБ), чтобы отклонять слишком большие файлы. Отклонённые файлы отображаются как ошибки с сообщением о размере.

Max 500KB per file
vue
<script setup lang="ts">
import { ref } from 'vue'
import type { UploadFile } from 'veloxui'

const files = ref<UploadFile[]>([])
</script>

<template>
  <VxUpload
    v-model="files"
    action="/api/upload"
    :max-size="500"
    tip="Max 500KB per file"
  />
</template>

Custom Request ​

Используйте custom-request, чтобы самостоятельно обработать загрузку (например, с axios, S3 presigned URL и т. д.).

Using custom upload handler
vue
<script setup lang="ts">
import { ref } from 'vue'
import type { UploadFile, UploadRequestOptions } from 'veloxui'

const files = ref<UploadFile[]>([])

function customUpload(options: UploadRequestOptions) {
  const formData = new FormData()
  formData.append('file', options.file)

  fetch('/api/upload', { method: 'POST', body: formData })
    .then(res => res.json())
    .then(data => options.onSuccess(data))
    .catch(err => options.onError(err.message))
}
</script>

<template>
  <VxUpload
    v-model="files"
    :custom-request="customUpload"
    multiple
  />
</template>

Pre-populated List ​

Передайте существующие файлы через v-model, чтобы показать предзаполненный список.

report.pdf239.3 KB
data.csv12.1 KB
vue
<script setup lang="ts">
import { ref } from 'vue'
import type { UploadFile } from 'veloxui'

const files = ref<UploadFile[]>([
  { uid: '1', name: 'report.pdf', size: 245000, status: 'success' },
  { uid: '2', name: 'data.csv', size: 12400, status: 'success' },
])
</script>

<template>
  <VxUpload v-model="files" action="/api/upload" />
</template>

Disabled ​

file.pdf120.1 KB
vue
<template>
  <VxUpload v-model="files" disabled />
</template>

Props ​

PropTypeDefaultDescription
modelValueUploadFile[][]Список файлов (v-model)
actionstring''URL endpoint загрузки
headersRecord<string, string>—Пользовательские заголовки запроса
dataRecord<string, string>—Дополнительные поля form data
namestring'file'Имя поля формы для файла
withCredentialsbooleanfalseОтправлять cookie с запросом
acceptstring''Принимаемые типы файлов (например image/*, .pdf)
multiplebooleanfalseРазрешить выбор нескольких файлов
limitnumber0Макс. число файлов (0 = без ограничения)
maxSizenumber0Макс. размер файла в КБ (0 = без ограничения)
disabledbooleanfalseОтключить загрузку
dragbooleanfalseВключить drag-and-drop зону
listType'text' | 'picture' | 'picture-card''text'Стиль отображения списка файлов
showFileListbooleantrueПоказывать список файлов под триггером
autoUploadbooleantrueЗагружать сразу при выборе
customRequest(options: UploadRequestOptions) => void—Пользовательский обработчик загрузки
beforeUpload(file: File) => boolean | Promise<boolean>—Хук перед началом загрузки
tipstring''Подсказка под триггером

Events ​

EventTypeDescription
update:modelValue(files)Список файлов изменён
change(file, files)Файл добавлен или его статус изменён
remove(file, files)Файл удалён
success(file, response)Загрузка успешна
error(file, error)Ошибка загрузки
progress(file, percent)Прогресс загрузки обновлён
exceed(files, limit)Превышен лимит файлов
preview(file)Запрошен предпросмотр файла (клик по имени или иконке глаза)

Slots ​

SlotDescription
defaultПользовательское содержимое триггера (заменяет внутреннюю часть кнопки или drag-зоны)
tipПользовательское содержимое подсказки под триггером

Exposed Methods ​

MethodDescription
submit()Вручную загрузить все файлы со status: 'ready' (когда autoUpload равен false)
trigger()Программно открыть диалог выбора файлов

UploadFile Interface ​

ts
interface UploadFile {
  uid: string           // Unique identifier
  name: string          // File name
  size?: number         // File size in bytes
  type?: string         // MIME type
  status: 'ready' | 'uploading' | 'success' | 'error'
  percent?: number      // Upload progress (0-100)
  url?: string          // File URL (for pre-existing files)
  thumbUrl?: string     // Thumbnail URL (auto-generated for images)
  raw?: File            // Original File object
  response?: any        // Server response
  error?: string        // Error message
}

UploadRequestOptions Interface ​

ts
interface UploadRequestOptions {
  file: File
  onProgress: (percent: number) => void
  onSuccess: (response: any) => void
  onError: (error: string) => void
}