Skip to content

FileUpload 文件上传

点击 / 拖拽 / 粘贴选文件;业务在 on-change 中自行上传云端;支持 oss-base 远程回显。

基础用法 ​

本地维护文件列表,组件不负责云端上传。

云端上传钩子 ​

添加文件后 status 为 ready,组件触发 change 事件;业务上传完成后回写 success / fail 与 url(状态变化会再次触发 change)。旧版 on-change prop 仍可用,但已标记为 deprecated,下一主版本移除,建议迁移到 change 事件。

远程回显 ​

无本地 File 时,用 fileUrl / url + oss-base 拼展示地址;已是 http(s):// 全链接则不再拼接。

  • 微信图片_20260327145152_105_2.jpg106.5 KB · 点击缩略图预览
  • 已是全链接示例.png2.0 KB · 点击缩略图预览

自定义上传和文件列表插槽 ​

upload 和 file-list 两个作用域插槽分别接管上传入口与文件列表。组件会把文件数据、状态和常用交互方法作为作用域参数传入;未传入任一插槽时仍使用对应的内置 UI。隐藏的文件选择 input 仍由组件维护,业务按钮调用 open() 即可打开选择器。

下面的示例用 change 模拟业务上传:选中文件后先显示“上传中”和进度,700ms 后回写为“已上传”;实际项目中将这段 mock 逻辑替换为自己的上传 API 即可。

上传合同附件支持 PDF、Word、Excel 和图片,单个文件不超过 10 MB
选择文件后,附件会显示在这里
vue
<script setup lang="ts">
import { ref } from 'vue'
import { FileText, Trash2, UploadCloud } from '@lucide/vue'
import { RdFileUpload, type UploadFileItem } from '@rd-element/ui'

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

function statusText(status: UploadFileItem['status']) {
  if (status === 'uploading') return '上传中'
  if (status === 'success') return '已上传'
  if (status === 'fail') return '上传失败'
  return '待上传'
}

function statusType(status: UploadFileItem['status']) {
  if (status === 'success') return 'success'
  if (status === 'fail') return 'danger'
  if (status === 'uploading') return 'warning'
  return 'info'
}
</script>

<template>
  <RdFileUpload v-model="files">
    <template #upload="{ canSelect, open, dragOver }">
      <div class="upload-entry" :class="{ 'is-dragover': dragOver }">
        <UploadCloud :size="20" />
        <span>
          <strong>{{ dragOver ? '松开鼠标即可上传' : '上传合同附件' }}</strong>
          <small>支持 PDF、Word、Excel 和图片,单个文件不超过 10 MB</small>
        </span>
        <el-button type="primary" :disabled="!canSelect" @click="open">选择文件</el-button>
      </div>
    </template>
    <template #file-list="{ files, remove, displayName, displaySize, getPreviewUrl, isImageFile }">
      <p v-if="!files.length" class="empty-hint">选择文件后,附件会显示在这里</p>
      <ul v-else class="file-list">
        <li v-for="file in files" :key="file.uid" class="file-list__item">
          <el-image
            v-if="isImageFile(file) && getPreviewUrl(file)"
            :src="getPreviewUrl(file)"
            :preview-src-list="[getPreviewUrl(file)]"
            fit="cover"
            preview-teleported
          />
          <FileText v-else :size="18" />
          <span class="file-list__main">
            <strong>{{ displayName(file) }}</strong>
            <span>{{ displaySize(file) }} <el-tag size="small" :type="statusType(file.status)">{{ statusText(file.status) }}</el-tag></span>
            <el-progress v-if="file.status === 'uploading'" :percentage="file.percent ?? 0" :show-text="false" />
          </span>
          <el-button text type="danger" aria-label="删除文件" @click="remove(file.uid)">
            <Trash2 :size="15" />
          </el-button>
        </li>
      </ul>
    </template>
  </RdFileUpload>
</template>

两个插槽的作用域参数类型均为导出的 RdFileUploadSlotProps。

API ​

Attributes ​

属性名说明类型默认值
v-model文件列表(UploadFileItem[])UploadFileItem[][]
acceptaccept 属性string常见文档/图片
multiple多文件booleantrue
maxCount最大文件数number5
maxSizeMb单文件大小上限 MBnumber10
hint底部提示文案string自动生成
onChange文件状态钩子:添加(ready)、变为 success / fail 时调用;业务在此上传云端并回写 status / url(file, files) => void—
ossBaseOSS 域名或前缀;fileUrl/url 已是 http(s) 全链接时不再拼接string''

Events ​

事件名说明类型
update:modelValue文件列表变更(files: UploadFileItem[]) => void
change文件列表整表变更(files: UploadFileItem[]) => void

Slots ​

插槽名说明
upload接管上传入口、图标和提示;未提供时使用内置 fallback。参数类型为 RdFileUploadSlotProps。
file-list接管文件列表、预览和操作按钮;未提供时使用内置 fallback。参数类型为 RdFileUploadSlotProps。

UploadFileItem ​

字段说明类型
uid唯一键string
name / size / type展示用元数据string / number / string
file本地新选才有;纯回显可无File?
statusready | uploading | success | failstring?
url完整可访问地址string?
fileUrl相对或绝对 pathstring?
fileName / fileSha1 / fileSize / fileSuffix远程透传字段可选
percent / response进度与原始响应可选

类型别名:UploadFile、UploadFiles。