Skip to content

FxUpload 文件上传

通过点击或拖拽上传文件。不依赖任何 UI 框架

FxUpload 属于 @fx/components

基础用法

使用 slot 自定义上传按钮的类型与文字。设置 limiton-exceed 限制最大上传数量并定义超限时的处理方式。还可在 before-remove 钩子中中止移除。

覆盖前一个文件

设置 limiton-exceed,在选择新文件时自动替换前一个文件。

用户头像

使用 before-upload 钩子限制上传文件的格式与大小。

照片墙

使用 list-type 改变文件列表样式。

自定义缩略图

使用 file 作用域插槽自定义缩略图模板。

文件列表缩略图

文件列表控制

使用 on-change 钩子控制上传文件列表。

拖拽上传

把文件拖到指定区域即可上传。

目录上传

通过 directory 开启文件夹上传。开启后只能选择文件夹,选择后其中的文件会被拍平。

手动上传

局部引入

ts
import { FxUpload, FxUploadDragger } from "@fx/components"

API

Attributes

属性说明类型默认值
action(必填)请求 URLstring'#'
headers请求头Headers | Record<string, any>
method设置上传请求方法string'post'
multiple是否允许多文件上传booleanfalse
data附带的表单数据,支持 Awaitable 与函数Record<string, any> | Awaitable<Record<string, any>> | ((rawFile: UploadRawFile) => Awaitable<Record<string, any>>){}
name上传文件字段名string'file'
with-credentials是否发送 cookiebooleanfalse
show-file-list是否显示已上传文件列表booleantrue
drag是否开启拖拽上传booleanfalse
accept接受的文件类型string''
crossorigin原生属性 crossorigin'' | 'anonymous' | 'use-credentials'
on-preview点击已上传文件时的钩子(uploadFile: UploadFile) => void
on-remove文件移除时的钩子(uploadFile: UploadFile, uploadFiles: UploadFiles) => void
on-success上传成功时的钩子(response: any, uploadFile: UploadFile, uploadFiles: UploadFiles) => void
on-error上传失败时的钩子(error: Error, uploadFile: UploadFile, uploadFiles: UploadFiles) => void
on-progress上传进度时的钩子(evt: UploadProgressEvent, uploadFile: UploadFile, uploadFiles: UploadFiles) => void
on-change文件状态改变时的钩子(选择 / 成功 / 失败)(uploadFile: UploadFile, uploadFiles: UploadFiles) => void
on-exceed超出限制时的钩子(files: File[], uploadFiles: UploadUserFile[]) => void
before-upload上传前钩子,返回 false 或被 reject 的 Promise 将中止上传(rawFile: UploadRawFile) => Awaitable<void | undefined | null | boolean | File | Blob>
before-remove删除前钩子,返回 false 或被 reject 的 Promise 将中止删除(uploadFile: UploadFile, uploadFiles: UploadFiles) => Awaitable<boolean>
file-list / v-model:file-list默认已上传文件列表UploadUserFile[][]
list-type文件列表类型'text' | 'picture' | 'picture-card''text'
auto-upload是否自动上传booleantrue
http-request覆盖默认 xhr 行为,自定义上传请求(options: UploadRequestOptions) => XMLHttpRequest | Promise<unknown>ajaxUpload
disabled是否禁用上传booleanfalse
limit最大上传数量number
directory是否支持目录上传。开启后只能选择文件夹,选择后其中的文件会被拍平booleanfalse

Slots

名称说明类型
default自定义默认内容
trigger触发文件对话框的内容
tip提示内容
file缩略图模板内容{ file: UploadFile, index: number }

Exposes

名称说明类型
abort取消上传请求。指定 file 则取消对应挂起上传;未指定则取消所有(file?: UploadFile) => void
submit手动上传文件列表() => void
clearFiles清空文件列表(此方法在 before-upload 钩子中不支持)(status?: UploadStatus[]) => void
handleStart手动选择文件(rawFile: UploadRawFile) => void
handleRemove手动移除文件。filerawFile 已合并(file: UploadFile | UploadRawFile, rawFile?: UploadRawFile) => void

类型声明

展开声明
ts
type UploadFiles = UploadFile[]

type UploadUserFile = Omit<UploadFile, "status" | "uid"> &
  Partial<Pick<UploadFile, "status" | "uid">>

type UploadStatus = "ready" | "uploading" | "success" | "fail"

type Awaitable<T> = Promise<T> | T

interface UploadFile {
  name: string
  percentage?: number
  status: UploadStatus
  size?: number
  response?: unknown
  uid: number
  url?: string
  raw?: UploadRawFile
}

interface UploadProgressEvent extends ProgressEvent {
  percent: number
}

interface UploadRawFile extends File {
  uid: number
  isDirectory?: boolean
}

interface UploadRequestOptions {
  action: string
  method: string
  data: Record<string, string | Blob | [string | Blob, string] | string[]>
  filename: string
  file: UploadRawFile
  headers: Headers | Record<string, string | number | null | undefined>
  onError: (evt: UploadAjaxError) => void
  onProgress: (evt: UploadProgressEvent) => void
  onSuccess: (response: any) => void
  withCredentials: boolean
}

实现说明

  • 4 件套结构:FxUpload 组装 upload-content(触发器 + <input type="file">)与 upload-list(文件列表),FxUploadDragger 提供拖拽容器;use-handlers 管理文件状态机与 v-model:file-list 双向绑定。
  • 类名由 useNamespace('upload' / 'icon' / 'list') 生成;样式走 @fx/styles token(--color-* / --duration-*)。
  • 图标使用 FxIcon@fx-core/icon),图标名 ep:document / ep:check / ep:circle-check / ep:close / ep:delete / ep:zoom-in / ep:upload-filled 等;图标颜色由 scss 按状态/位置控制,故 FxIcon 传 color="" 禁用内联色、size 仍用 prop。
  • 进度条使用 FxProgress;上传请求默认基于 XMLHttpRequest + FormData,可通过 http-request 覆盖。
  • before-upload 返回 false / reject / 返回新 File/Blob 可中止或替换上传文件。