Skip to content

Upload 上传

Upload 用于通过点击或拖拽上传文件。VISTA B 直接使用 Element Plus 的 el-upload,适合头像上传、图片墙、附件列表、手动提交和目录上传等场景。

基础用法

通过默认插槽可以自定义上传按钮,通过 tip 插槽添加提示文案。可设置 limiton-exceed 限制上传文件个数,也可通过 before-remove 阻止文件移除。

jpg/png files with a size less than 500KB.
未操作
vue
<el-upload
  v-model:file-list="fileList"
  action="#"
  multiple
  :limit="3"
  :on-exceed="handleExceed"
>
  <el-button type="primary">Click to upload</el-button>
  <template #tip>
    <div class="el-upload__tip">jpg/png files with a size less than 500KB.</div>
  </template>
</el-upload>

覆盖前一个文件

设置 limiton-exceed 后,可以在用户重新选择文件时自动替换前一个文件。

limit 1 file, new file will cover the old file
    vue
    <el-upload
      ref="upload"
      action="#"
      :limit="1"
      :on-exceed="handleExceed"
      :auto-upload="false"
    >
      <template #trigger>
        <el-button type="primary">select file</el-button>
      </template>
      <el-button type="success" @click="submitUpload">upload to server</el-button>
    </el-upload>

    用户头像

    before-upload 钩子中可以限制上传文件的格式和大小。下面示例只允许上传小于 2MB 的 JPG/PNG 图片。

    vue
    <el-upload
      class="avatar-uploader"
      action="#"
      :show-file-list="false"
      :on-success="handleAvatarSuccess"
      :before-upload="beforeAvatarUpload"
    >
      <img v-if="imageUrl" :src="imageUrl" class="avatar" />
      <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
    </el-upload>

    照片墙

    使用 list-type="picture-card" 可以把文件列表展示为照片墙。点击缩略图时可以通过 on-preview 展示大图。

    • press delete to remove
    • press delete to remove
    vue
    <el-upload
      v-model:file-list="fileList"
      action="#"
      list-type="picture-card"
      :on-preview="handlePictureCardPreview"
    >
      <el-icon><Plus /></el-icon>
    </el-upload>

    自定义缩略图

    通过 file 插槽可以自定义文件缩略图内容和操作按钮。

    vue
    <el-upload action="#" list-type="picture-card" :auto-upload="false">
      <el-icon><Plus /></el-icon>
      <template #file="{ file }">
        <img class="el-upload-list__item-thumbnail" :src="file.url" alt="" />
      </template>
    </el-upload>

    图片列表缩略图

    设置 list-type="picture" 后,文件列表会以带缩略图的列表形式展示。

    jpg/png files with a size less than 500kb
    vue
    <el-upload
      v-model:file-list="fileList"
      action="#"
      list-type="picture"
    >
      <el-button type="primary">Click to upload</el-button>
    </el-upload>

    上传文件列表控制

    通过 on-change 可以控制上传文件列表。下面示例保留最近 3 个文件。

    Only keep the latest 3 files.
    vue
    <el-upload
      v-model:file-list="fileList"
      action="#"
      :on-change="handleChange"
    >
      <el-button type="primary">Click to upload</el-button>
    </el-upload>

    拖拽上传

    设置 drag 后可以拖拽文件到上传区域,也可以点击区域选择文件。

    Drop file here or click to upload
    jpg/png files with a size less than 500kb
      vue
      <el-upload drag action="#" multiple>
        <el-icon class="el-icon--upload"><UploadFilled /></el-icon>
        <div class="el-upload__text">
          Drop file here or <em>click to upload</em>
        </div>
      </el-upload>

      上传目录

      设置 directory 后可以选择文件夹。选择文件夹后,文件夹内的文件会被扁平化处理。

      Drop directory here or click to upload
        vue
        <el-upload
          drag
          action="#"
          directory
          multiple
        >
          <el-icon class="el-icon--upload"><UploadFilled /></el-icon>
          <div class="el-upload__text">Drop directory here or click to upload</div>
        </el-upload>

        手动上传

        设置 auto-upload="false" 后,文件选择不会自动上传,需要调用组件实例的 submit 方法。

        jpg/png files with a size less than 500kb
          vue
          <script setup>
          import { ref } from 'vue'
          
          const uploadRef = ref()
          
          const submitUpload = () => {
            uploadRef.value?.submit()
          }
          </script>
          
          <template>
            <el-upload ref="uploadRef" action="#" :auto-upload="false">
              <template #trigger>
                <el-button type="primary">select file</el-button>
              </template>
              <el-button type="success" @click="submitUpload">upload to server</el-button>
            </el-upload>
          </template>

          API

          Upload 属性

          属性说明类型默认值
          action请求 URLstring#
          headers设置上传请求头object
          method上传请求方法stringpost
          multiple是否支持多选文件booleanfalse
          data上传时附带的额外参数,支持对象、函数或 Promiseobject / function / Promise{}
          name上传的文件字段名stringfile
          with-credentials是否发送 cookie 凭证信息booleanfalse
          show-file-list是否显示已上传文件列表booleantrue
          drag是否启用拖拽上传booleanfalse
          accept接受上传的文件类型string
          crossorigin图片相关原生 crossorigin 属性anonymous / use-credentials / ''
          on-preview点击文件列表中已上传文件时的钩子function
          on-remove文件列表移除文件时的钩子function
          on-success文件上传成功时的钩子function
          on-error文件上传失败时的钩子function
          on-progress文件上传过程中的钩子function
          on-change文件状态改变时的钩子,添加文件、上传成功和上传失败时都会调用function
          on-exceed文件数量超出限制时的钩子function
          before-upload上传文件前的钩子,返回 false 或 rejected Promise 会停止上传function
          before-remove删除文件前的钩子,返回 false 或 rejected Promise 会停止删除function
          file-list / v-model:file-list默认上传文件列表array[]
          list-type文件列表类型text / picture / picture-cardtext
          auto-upload是否自动上传文件booleantrue
          http-request覆盖默认 XHR 行为,自定义上传请求function默认 XHR
          disabled是否禁用上传booleanfalse
          limit允许上传文件的最大数量number
          directory是否支持上传文件夹booleanfalse

          Upload 插槽

          插槽说明
          default自定义默认内容
          trigger触发文件选择框的内容
          tip提示说明文字
          file缩略图模板内容,参数为 { file, index }

          Upload 方法

          方法名说明类型
          abort取消上传请求;传入文件时取消对应文件,不传时取消所有文件(file?: UploadFile) => void
          submit手动上传文件列表() => void
          clearFiles清空已上传文件列表,不支持在 before-upload 中调用(status?: UploadStatus[]) => void
          handleStart手动选择文件(rawFile: UploadRawFile) => void
          handleRemove手动移除文件(file: UploadFile | UploadRawFile) => void

          使用提醒

          真实业务中需要把 actionheadersdatawith-credentials 与后端接口契约对齐。需要在文档或本地演示中避免真实请求时,可以像本页一样使用 http-request 接管上传行为。

          HOMEVISTA 设计规范