Skip to content

上传组件

上传组件提供了图片上传、文件上传、文件管理等功能,支持本地和云存储。

导入

typescript
import {
  DuxFileManage,
  DuxFileUpload,
  DuxImageUpload
} from '@duxweb/dvha-pro'

组件总览

DVHA Pro 提供以下上传组件:

  • DuxImageUpload - 图片上传组件
  • DuxFileUpload - 文件上传组件
  • DuxFileManage - 文件管理组件

DuxImageUpload 图片上传

图片上传组件,支持单张或多张图片上传,提供预览、拖拽排序、文件管理等功能。

属性

属性名类型默认值说明
pathstring'upload'上传接口路径
managePathstring''文件管理接口路径
maxNumnumber-最大上传数量
maxSizenumber5最大文件大小(MB)
multiplebooleanfalse是否支持多选
managerbooleanfalse是否显示文件管理按钮
valuestring | string[]-上传结果值
defaultValuestring | string[]-默认值

事件

事件名类型说明
update:value(value?: string | string[]) => void值更新时触发

基础用法

vue
<script setup lang="ts">
import { DuxImageUpload } from '@duxweb/dvha-pro'
import { ref } from 'vue'

const imageUrl = ref('')
const imageUrls = ref<string[]>([])
</script>

<template>
  <!-- 单张图片上传 -->
  <DuxImageUpload
    v-model:value="imageUrl"
    path="/api/upload"
    :max-size="10"
  />

  <!-- 多张图片上传 -->
  <DuxImageUpload
    v-model:value="imageUrls"
    path="/api/upload"
    multiple
    :max-num="5"
    :max-size="10"
  />
</template>

带文件管理的上传

vue
<script setup lang="ts">
import { DuxImageUpload } from '@duxweb/dvha-pro'
import { ref } from 'vue'

const images = ref<string[]>([])
</script>

<template>
  <DuxImageUpload
    v-model:value="images"
    path="/api/upload"
    manage-path="/api/files"
    multiple
    manager
    :max-num="10"
    :max-size="5"
  />
</template>

DuxFileUpload 文件上传

文件上传组件,支持各种文件类型上传,提供拖拽上传、进度显示、文件列表等功能。

属性

属性名类型默认值说明
pathstring''上传接口路径
managePathstring''文件管理接口路径
maxNumnumber-最大上传数量
maxSizenumber5最大文件大小(MB)
multiplebooleanfalse是否支持多选
managerbooleanfalse是否显示文件管理按钮
acceptstring-接受的文件类型
valuestring | string[]-上传结果值
defaultValuestring | string[]-默认值

事件

事件名类型说明
update:value(value?: string | string[]) => void值更新时触发

基础用法

vue
<script setup lang="ts">
import { DuxFileUpload } from '@duxweb/dvha-pro'
import { ref } from 'vue'

const fileUrl = ref('')
const fileUrls = ref<string[]>([])
</script>

<template>
  <!-- 单文件上传 -->
  <DuxFileUpload
    v-model:value="fileUrl"
    path="/api/upload"
    accept="application/pdf"
    :max-size="20"
  />

  <!-- 多文件上传 -->
  <DuxFileUpload
    v-model:value="fileUrls"
    path="/api/upload"
    multiple
    accept="image/*,application/pdf,.doc,.docx"
    :max-num="10"
    :max-size="50"
  />
</template>

不同文件类型

vue
<template>
  <!-- 图片文件 -->
  <DuxFileUpload
    v-model:value="images"
    accept="image/*"
    path="/api/upload"
    multiple
  />

  <!-- 视频文件 -->
  <DuxFileUpload
    v-model:value="videos"
    accept="video/*"
    path="/api/upload"
    :max-size="100"
  />

  <!-- 文档文件 -->
  <DuxFileUpload
    v-model:value="documents"
    accept=".pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx"
    path="/api/upload"
    multiple
  />

  <!-- 音频文件 -->
  <DuxFileUpload
    v-model:value="audios"
    accept="audio/*"
    path="/api/upload"
    multiple
  />
</template>

带文件管理的上传

vue
<script setup lang="ts">
import { DuxFileUpload } from '@duxweb/dvha-pro'
import { ref } from 'vue'

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

<template>
  <DuxFileUpload
    v-model:value="files"
    path="/api/upload"
    manage-path="/api/files"
    multiple
    manager
    accept="image/*,application/pdf"
    :max-num="20"
    :max-size="10"
  />
</template>

DuxFileManage 文件管理

文件管理组件,提供文件浏览、选择、删除、重命名、新建文件夹等功能。

属性

属性名类型默认值说明
pathstring-文件管理接口路径
type'all' | 'image' | 'media' | 'docs''all'文件类型筛选
multiplebooleanfalse是否支持多选
pagebooleantrue是否为页面模式
handlestring-拖拽手柄类名
uploadParamsIUploadParams-上传参数配置

事件

事件名类型说明
confirm(value: Record<string, any>[]) => void确认选择时触发
close() => void关闭时触发

IUploadParams 接口

typescript
interface IUploadParams {
  path?: string // 上传接口路径
  accept?: string // 接受的文件类型
  multiple?: boolean // 是否支持多选
  maxNum?: number // 最大上传数量
  maxSize?: number // 最大文件大小(MB)
}

基础用法

vue
<script setup lang="ts">
import { DuxFileManage } from '@duxweb/dvha-pro'
import { ref } from 'vue'

const selectedFiles = ref<any[]>([])

function handleConfirm(files: any[]) {
  selectedFiles.value = files
  console.log('选择的文件:', files)
}

function handleClose() {
  console.log('关闭文件管理')
}
</script>

<template>
  <DuxFileManage
    path="/api/files"
    type="all"
    multiple
    :upload-params="{
      path: '/api/upload',
      accept: 'image/*,application/pdf',
      maxNum: 10,
      maxSize: 20,
    }"
    @confirm="handleConfirm"
    @close="handleClose"
  />
</template>

模态框中使用

vue
<script setup lang="ts">
import { useModal } from '@duxweb/dvha-pro'

const modal = useModal()

function openFileManager() {
  modal.show({
    title: '文件管理',
    width: 800,
    component: () => import('@duxweb/dvha-pro').then(m => m.DuxFileManage),
    componentProps: {
      path: '/api/files',
      multiple: true,
      uploadParams: {
        path: '/api/upload',
        accept: 'image/*',
        maxNum: 5,
        maxSize: 10
      }
    }
  }).then((files) => {
    console.log('选择的文件:', files)
  }).catch(() => {
    console.log('取消选择')
  })
}
</script>

<template>
  <n-button @click="openFileManager">
    选择文件
  </n-button>
</template>

表单集成

在表单中使用图片上传

vue
<script setup lang="ts">
import { DuxFormItem, DuxImageUpload } from '@duxweb/dvha-pro'
import { ref } from 'vue'

const form = ref({
  avatar: '',
  gallery: []
})
</script>

<template>
  <form>
    <!-- 头像上传 -->
    <DuxFormItem label="头像" path="avatar" rule="required">
      <DuxImageUpload
        v-model:value="form.avatar"
        path="/api/upload"
        :max-size="5"
      />
    </DuxFormItem>

    <!-- 图片库 -->
    <DuxFormItem label="图片库" path="gallery">
      <DuxImageUpload
        v-model:value="form.gallery"
        path="/api/upload"
        multiple
        manager
        :max-num="10"
        :max-size="10"
      />
    </DuxFormItem>
  </form>
</template>

在表单中使用文件上传

vue
<script setup lang="ts">
import { DuxFileUpload, DuxFormItem } from '@duxweb/dvha-pro'
import { ref } from 'vue'

const form = ref({
  resume: '',
  attachments: []
})
</script>

<template>
  <form>
    <!-- 简历上传 -->
    <DuxFormItem label="简历" path="resume" rule="required">
      <DuxFileUpload
        v-model:value="form.resume"
        path="/api/upload"
        accept="application/pdf,.doc,.docx"
        :max-size="20"
      />
    </DuxFormItem>

    <!-- 附件上传 -->
    <DuxFormItem label="附件" path="attachments">
      <DuxFileUpload
        v-model:value="form.attachments"
        path="/api/upload"
        multiple
        manager
        accept="image/*,application/pdf,.doc,.docx,.xls,.xlsx"
        :max-num="20"
        :max-size="50"
      />
    </DuxFormItem>
  </form>
</template>

文件类型支持

支持的 MIME 类型

typescript
// 图片类型
accept = 'image/*'
accept = 'image/jpeg,image/png,image/gif,image/webp'

// 视频类型
accept = 'video/*'
accept = 'video/mp4,video/avi,video/mov'

// 音频类型
accept = 'audio/*'
accept = 'audio/mp3,audio/wav,audio/aac'

// 文档类型
accept = 'application/pdf'
accept = 'application/msword'
accept = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'

// 表格类型
accept = 'application/vnd.ms-excel'
accept = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'

// 演示文稿类型
accept = 'application/vnd.ms-powerpoint'
accept = 'application/vnd.openxmlformats-officedocument.presentationml.presentation'

// 文本类型
accept = 'text/*'
accept = 'text/plain,text/csv'

// 混合类型
accept = 'image/*,application/pdf,.doc,.docx,.xls,.xlsx'

常用文件扩展名

typescript
// 图片文件
accept = '.jpg,.jpeg,.png,.gif,.bmp,.webp,.svg'

// 文档文件
accept = '.pdf,.doc,.docx,.txt,.rtf'

// 表格文件
accept = '.xls,.xlsx,.csv'

// 演示文稿文件
accept = '.ppt,.pptx'

// 压缩文件
accept = '.zip,.rar,.7z,.tar,.gz'

// 音视频文件
accept = '.mp3,.wav,.mp4,.avi,.mov,.wmv'

上传配置

服务端配置

上传组件需要后端提供以下接口:

typescript
// 文件上传接口
POST /api/upload
Content-Type: multipart/form-data

// 请求参数
{
  file: File,        // 上传的文件
  folder?: string    // 上传到的文件夹
}

// 响应格式
{
  code: 200,
  data: {
    id: string,      // 文件ID
    url: string,     // 文件访问URL
    filename: string, // 文件名
    filesize: number, // 文件大小
    filetype: string, // 文件类型
    mime: string     // MIME类型
  }
}
typescript
// 文件管理接口
GET /api/files
Query: {
  page?: number,     // 页码
  pageSize?: number, // 每页数量
  type?: string,     // 文件类型筛选
  folder?: string    // 文件夹ID
}

// 响应格式
{
  code: 200,
  data: {
    data: Array<{
      id: string,
      name: string,
      url?: string,
      mime?: string,
      filesize?: number,
      type: 'file' | 'folder',
      created_at: string
    }>,
    meta: {
      total: number,
      page: number,
      pageSize: number,
      folder?: string
    }
  }
}

客户端配置

typescript
import { createDux } from '@duxweb/dvha-core'
// 在应用配置中设置上传路径
import { createApp } from 'vue'

const app = createApp(App)

app.use(createDux({
  manage: {
    apiPath: {
      upload: '/api/upload', // 上传接口路径
      uploadManage: '/api/files' // 文件管理接口路径
    }
  }
}))

最佳实践

1. 合理设置文件大小限制

vue
<template>
  <!-- 根据文件类型设置合适的大小限制 -->

  <!-- 头像图片:1-5MB -->
  <DuxImageUpload :max-size="5" />

  <!-- 文档文件:10-50MB -->
  <DuxFileUpload accept="application/pdf" :max-size="50" />

  <!-- 视频文件:100-500MB -->
  <DuxFileUpload accept="video/*" :max-size="500" />
</template>

2. 提供清晰的文件类型说明

vue
<template>
  <DuxFormItem
    label="产品图片"
    path="images"
    description="支持 JPG、PNG、GIF 格式,单个文件不超过10MB,最多上传5张"
  >
    <DuxImageUpload
      v-model:value="form.images"
      accept="image/jpeg,image/png,image/gif"
      multiple
      :max-num="5"
      :max-size="10"
    />
  </DuxFormItem>
</template>

3. 处理上传错误

vue
<script setup lang="ts">
import { useMessage } from 'naive-ui'

const message = useMessage()

// 监听上传错误
function handleUploadError(error: Error) {
  if (error.message.includes('size')) {
    message.error('文件大小超出限制')
  }
  else if (error.message.includes('type')) {
    message.error('不支持的文件类型')
  }
  else {
    message.error('上传失败,请重试')
  }
}
</script>

4. 优化用户体验

vue
<template>
  <!-- 提供文件管理功能 -->
  <DuxFileUpload
    v-model:value="files"
    multiple
    manager
    path="/api/upload"
    manage-path="/api/files"
  />

  <!-- 支持拖拽上传 -->
  <div class="upload-area">
    <p>拖拽文件到此处或点击上传</p>
    <DuxFileUpload v-model:value="files" />
  </div>
</template>