Skip to content

上传 Upload

文件选择上传和拖拽上传控件

何时使用

  • 当需要上传一个或一些文件时
  • 当需要展现上传的进度时
  • 当需要使用拖拽交互时

基本使用

Upload

Show Code
vue
<script setup lang="ts">
import { ref, watchEffect } from 'vue'
const files = ref([])
watchEffect(() => {
  console.log('files', files.value)
})
interface FileType {
  name?: string // 文件名
  url: any // 文件地址
  [propName: string]: any // 添加一个字符串索引签名,用于包含带有任意数量的其他属性
}
function onDrop(e: DragEvent) {
  console.log('drop', e)
}
function onChange(files: FileType[]) {
  console.log('change', files)
}
function onPreview(file: FileType) {
  console.log('preview', file)
}
function onRemove(file: FileType) {
  console.log('remove', file)
}
</script>
<template>
  <Upload v-model:fileList="files" @drop="onDrop" @change="onChange" @preview="onPreview" @remove="onRemove" />
</template>

禁用

只能预览,不能删除和上传


1.jpg

预览

Show Code
vue
<script setup lang="ts">
import { ref } from 'vue'
const imageList = ref([
  {
    name: '1.jpg',
    url: "https://cdn.jsdelivr.net/gh/themusecatcher/resources@0.0.5/1.jpg"
  }
])
</script>
<template>
  <Upload disabled v-model:file-list="imageList" />
</template>

限制数量

通过 maxCount 限制上传数量;当为 1 时,始终用最新上传的代替当前


maxCount: 1

1.jpg

预览

maxCount: 3

Show Code
vue
<script setup lang="ts">
import { ref, watchEffect } from 'vue'
const files = ref([])
const fileList = ref([
  {
    name: '1.jpg',
    url: "https://cdn.jsdelivr.net/gh/themusecatcher/resources@0.0.5/1.jpg"
  },
  {
    name: 'Markdown.pdf',
    url: 'https://cdn.jsdelivr.net/gh/themusecatcher/resources@0.0.5/Markdown.pdf'
  }
])
watchEffect(() => {
  console.log('files', files.value)
})
watchEffect(() => {
  console.log('fileList', fileList.value)
})
</script>
<template>
  <Space vertical>
    <Upload :max-count="1" tip="maxCount: 1" v-model:fileList="files" />
    <Upload :max-count="3" tip="maxCount: 3" v-model:fileList="fileList" />
  </Space>
</template>

多文件上传

可一次选择多个文件进行上传


Upload

Show Code
vue
<script setup lang="ts">
import { ref, watchEffect } from 'vue'
const files = ref([])
watchEffect(() => {
  console.log('files', files.value)
})
</script>
<template>
  <Upload multiple v-model:fileList="files" />
</template>

自定义样式布局

缩略图等比覆盖;上传描述文字使用:上传


1.jpg

预览

上传

Show Code
vue
<script setup lang="ts">
import { ref, watchEffect } from 'vue'
const fileList = ref([
  {
    name: '1.jpg',
    url: "https://cdn.jsdelivr.net/gh/themusecatcher/resources@0.0.5/1.jpg"
  },
  {
    name: 'Markdown.pdf',
    url: 'https://cdn.jsdelivr.net/gh/themusecatcher/resources@0.0.5/Markdown.pdf'
  }
])
watchEffect(() => {
  console.log('fileList', fileList.value)
})
</script>
<template>
  <Upload tip="上传" fit="cover" v-model:fileList="fileList" />
</template>

排列间距使用:'middle';自定义上传 uploading 动画样式


1.jpg

预览

Upload

Show Code
vue
<script setup lang="ts">
import { ref, watchEffect } from 'vue'
const fileList = ref([
  {
    name: '1.jpg',
    url: "https://cdn.jsdelivr.net/gh/themusecatcher/resources@0.0.5/1.jpg"
  },
  {
    name: 'Markdown.pdf',
    url: 'https://cdn.jsdelivr.net/gh/themusecatcher/resources@0.0.5/Markdown.pdf'
  }
])
watchEffect(() => {
  console.log('fileList', fileList.value)
})
</script>
<template>
  <Upload
    :space-props="{ gap: 'middle' }"
    :spin-props="{ indicator: 'spin-dot', color: '#ff6900', tip: '上传中...' }"
    v-model:fileList="fileList"
  />
</template>

自定义操作完成的消息提示

1.jpg

预览

Upload

Show Code
vue
<script setup lang="ts">
import { ref, watchEffect } from 'vue'
const fileList = ref([
  {
    name: '1.jpg',
    url: "https://cdn.jsdelivr.net/gh/themusecatcher/resources@0.0.5/1.jpg"
  },
  {
    name: 'Markdown.pdf',
    url: 'https://cdn.jsdelivr.net/gh/themusecatcher/resources@0.0.5/Markdown.pdf'
  }
])
watchEffect(() => {
  console.log('fileList', fileList.value)
})
</script>
<template>
  <Upload
    :action-message="{
      upload: 'upload success',
      remove: 'remove success'
    }"
    v-model:fileList="fileList"
  />
</template>

上传文件校验

上传文件最大 500KB;同时限定文件类型


1.jpg

预览

Only Image

Only PDF

Show Code
vue
<script setup lang="ts">
import { ref } from 'vue'
const uploadRef = ref()
const imageList = ref([
  {
    name: '1.jpg',
    url: "https://cdn.jsdelivr.net/gh/themusecatcher/resources@0.0.5/1.jpg"
  }
])
const pdfList = ref([
  {
    name: 'Markdown.pdf',
    url: 'https://cdn.jsdelivr.net/gh/themusecatcher/resources@0.0.5/Markdown.pdf'
  }
])
watchEffect(() => {
  console.log('imageList', imageList.value)
})
watchEffect(() => {
  console.log('pdfList', pdfList.value)
})
function onBeforeImageUpload(file: File) {
  if (file.size > 500 * 1024) {
    // 文件大于 500KB 时取消上传
    uploadRef.value.warning('文件必须小于 500KB')
    return false // 停止上传
  }
  console.log('file', file)
  console.log('type', file.type)
  if (!file.type.includes('image')) {
    // 继续上传
    uploadRef.value.error('只能上传图片')
    return false // 停止上传
  }
  return true // 继续上传
}
function onBeforePdfUpload(file: File) {
  const acceptTypes = ['application/pdf']
  if (file.size > 500 * 1024) {
    // 文件大于 500KB 时取消上传
    uploadRef.value.warning('文件必须小于 500KB')
    return false // 停止上传
  }
  if (!acceptTypes.includes(file.type)) {
    // 继续上传
    uploadRef.value.error('只能上传 pdf 格式的文件')
    return false // 停止上传
  }
  return true // 继续上传
}
interface FileType {
  name?: string // 文件名
  url: any // 文件地址
  [propName: string]: any // 添加一个字符串索引签名,用于包含带有任意数量的其他属性
}
function onChange (files: FileType[]) {
  console.log('change', files)
}
function onRemove (file: FileType) {
  console.log('remove', file)
}
</script>
<template>
  <Space vertical>
    <Upload
      ref="uploadRef"
      accept="image/*"
      tip="Only Image"
      :before-upload="onBeforeImageUpload"
      v-model:fileList="imageList"
      @change="onChange"
      @remove="onRemove"
    />
    <Upload
      ref="uploadRef"
      accept="application/pdf"
      tip="Only PDF"
      :before-upload="onBeforePdfUpload"
      v-model:fileList="pdfList"
      @change="onChange"
      @remove="onRemove"
    />
  </Space>
</template>

自定义上传行为

1.jpg

预览

Upload

Show Code
vue
<script setup lang="ts">
import { ref } from 'vue'
const fileList = ref([
  {
    name: '1.jpg',
    url: "https://cdn.jsdelivr.net/gh/themusecatcher/resources@0.0.5/1.jpg"
  },
  {
    name: 'Markdown.pdf',
    url: 'https://cdn.jsdelivr.net/gh/themusecatcher/resources@0.0.5/Markdown.pdf'
  }
])
watchEffect(() => {
  console.log('fileList', fileList.value)
})
function onCustomRequest(file: File) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      // 模拟接口调用返回name和url
      if (file.type === 'application/pdf') {
        var res = {
          name: 'Markdown.pdf',
          url: 'https://cdn.jsdelivr.net/gh/themusecatcher/resources@0.0.5/Markdown.pdf'
        }
      } else {
        var res = {
          name: '1.jpg',
          url: 'https://cdn.jsdelivr.net/gh/themusecatcher/resources@0.0.5/1.jpg'
        }
      }
      if (res) {
        resolve(res)
      } else {
        reject('upload request fail ...')
      }
    }, 1000)
  })
}
interface FileType {
  name?: string // 文件名
  url: any // 文件地址
  [propName: string]: any // 添加一个字符串索引签名,用于包含带有任意数量的其他属性
}
function onChange (files: FileType[]) {
  console.log('change', files)
}
function onRemove (file: FileType) {
  console.log('remove', file)
}
</script>
<template>
  <Upload
    multiple
    upload-mode="custom"
    :custom-request="onCustomRequest"
    v-model:fileList="fileList"
    @change="onChange"
    @remove="onRemove"
  />
</template>

APIs

Upload

参数说明类型默认值
accept接受上传的文件类型,与<input type="file" />accept 属性一致,参考 input accept Attributestring'*'
multiple是否支持多选文件,开启后可选择多个文件booleanfalse
maxCount限制上传数量。当为 1 时,始终用最新上传的文件代替当前文件numberundefined
tip上传描述文字string'Upload'
fit预览图片缩放规则,参考 object-fit,仅当上传文件为图片时生效'fill' | 'contain' | 'cover' | 'none' | 'scale-down''contain'
draggable是否支持拖拽上传,开启后可拖拽文件到选择框上传booleantrue
disabled是否禁用,只能预览,不能删除和上传booleanfalse
spacePropsSpace 组件属性配置,参考 Space Props,用于配置多个文件时的排列方式object{}
spinPropsSpin 组件属性配置,参考 Spin Props,用于配置上传中样式object{}
imagePropsImage 组件属性配置,参考 Image Props,用于配置图片预览object{}
messagePropsMessage 组件属性配置,参考 Message Props,用于配置操作消息提示object{}
actionMessage操作成功的消息提示,传 {} 即可不显示任何消息提示MessageType{ upload: '上传成功', remove: '删除成功' }
beforeUpload上传文件之前的钩子,参数为上传的文件,返回 false 则停止上传,返回 true 开始上传;支持返回一个 Promise 对象(如服务端校验等),Promise 对象 reject 时停止上传,resolve 时开始上传;通常用来校验用户上传的文件格式和大小Function() => true
uploadMode上传文件的方式,可选 'base64' | 'custom''base64' | 'custom''base64'
customRequest自定义上传行为,只有 uploadMode: custom 时,才会使用 customRequest 自定义上传行为Function() => {}
fileList
v-model
已上传的文件列表FileType[][]

FileType Type

名称说明类型默认值
name?文件名stringundefined
url文件地址stringundefined
[propName: string]用于包含带有任意数量的其他属性anyundefined

MessageType Type

名称说明类型默认值
upload?上传成功的消息提示,没有设置该属性时即不显示上传消息提示string'上传成功'
remove?删除成功的消息提示,没有设置该属性时即不显示删除消息提示string'删除成功'

Methods

名称说明类型
info上传基本信息提示(content: string) => void
success上传成功信息提示(content: string) => void
error上传失败信息提示(content: string) => void
warning上传警告信息提示(content: string) => void
loading加载中信息提示(content: string) => void

Events

名称说明类型
drop当文件被拖入上传区域时的回调(e: DragEvent) => void
change上传文件改变时的回调(files: FileType[]) => void
preview点击预览时的回调(file: FileType) => void
remove点击移除文件时的回调(files: FileType) => void

Released under the MIT License.