# Upload Components - Naive UI 版本 本目录包含已重构为 Naive UI 的上传组件。 ## 组件列表 ### 1. ImageUpload - 图片上传组件 - **文件**: `image-upload.vue` - **功能**: 专门用于图片上传的组件,支持图片预览 - **特性**: - 支持单图/多图上传 - 支持图片预览(使用 NModal + NImage) - 支持拖拽上传 - 自动校验文件类型和大小 - 支持自定义上传 API - 支持进度显示 ### 2. FileUpload - 文件上传组件 - **文件**: `file-upload.vue` - **功能**: 通用文件上传组件 - **特性**: - 支持单文件/多文件上传 - 支持拖拽上传区域 - 支持文件预览和下载 - 自动校验文件类型和大小 - 支持自定义上传 API - 支持进度显示 - 支持返回文本内容(用于配置文件等) ### 3. InputUpload - 输入框上传组件 - **文件**: `input-upload.vue` - **功能**: 结合输入框和文件上传的组件 - **特性**: - 支持文本输入框或文本域 - 支持通过上传文件自动填充内容 - 使用 NGrid 布局,响应式设计 ## 使用示例 ### ImageUpload 图片上传 ```vue ``` ### FileUpload 文件上传 ```vue ``` ### InputUpload 输入框上传 ```vue ``` ## Props 说明 ### 通用 Props (FileUploadProps) | 属性 | 类型 | 默认值 | 说明 | | ---------------- | -------------------- | ------- | ------------------ | | modelValue/value | `string \| string[]` | - | v-model 绑定值 | | accept | `string[]` | `[]` | 接受的文件类型 | | maxSize | `number` | `2` | 文件最大大小(MB) | | maxNumber | `number` | `1` | 最大文件数量 | | multiple | `boolean` | `false` | 是否支持多选 | | disabled | `boolean` | `false` | 是否禁用 | | drag | `boolean` | `false` | 是否支持拖拽上传 | | directory | `string` | - | 上传目录 | | api | `Function` | - | 自定义上传 API | | showDescription | `boolean` | - | 是否显示描述文本 | ### ImageUpload 特有 Props | 属性 | 类型 | 默认值 | 说明 | | --- | --- | --- | --- | | listType | `string` | `'picture-card'` | 列表类型 | | accept | `string[]` | `['jpg', 'jpeg', 'png', 'gif', 'webp']` | 接受的图片类型 | | showDescription | `boolean` | `true` | 是否显示描述文本 | ### InputUpload 特有 Props | 属性 | 类型 | 默认值 | 说明 | | --------------- | ----------------------- | --------- | ---------------- | | inputType | `'input' \| 'textarea'` | `'input'` | 输入框类型 | | inputProps | `InputProps` | - | 输入框属性 | | fileUploadProps | `FileUploadProps` | - | 文件上传组件属性 | ## Events | 事件名 | 参数 | 说明 | | --- | --- | --- | | update:value | `value: string \| string[]` | 值更新事件 | | update:modelValue | `value: string \| string[]` | v-model 更新事件 | | change | `value: string \| string[]` | 值变化事件 | | delete | `file: UploadFileInfo` | 删除文件事件 | | preview | `file: UploadFileInfo` | 预览文件事件(仅 FileUpload) | | returnText | `text: string` | 返回文件文本内容(仅 FileUpload) | ## 辅助工具 ### useUpload - **文件**: `use-upload.ts` - **功能**: 提供上传相关的工具函数 - **主要方法**: - `httpRequest`: 统一的文件上传请求方法 - `getUploadUrl`: 获取上传 URL ### useUploadType - **功能**: 处理上传类型相关的逻辑 - **主要方法**: - `getStringAccept`: 获取 accept 字符串 - `getHelpText`: 获取帮助文本 ## 技术栈 - **UI 框架**: Naive UI - **核心组件**: - NUpload - NImage - NImageGroup - NModal - NButton - NGrid - NInput - **工具库**: - @vueuse/core - @vben/utils ## 注意事项 1. 文件状态使用 Naive UI 的状态值:`'pending' | 'uploading' | 'finished' | 'error' | 'removed'` 2. 所有文件 ID 使用 Naive UI 的 `id` 字段,而不是 `uid` 3. 上传前会自动校验文件类型和大小 4. 支持两种上传模式: - 客户端直接上传(S3) - 通过后端上传 5. 支持自定义上传 API,如果不提供则使用默认的上传接口 ## 迁移指南 从 Ant Design Vue 迁移到 Naive UI 的主要变化: 1. **组件导入**: ```typescript // 旧 import { Upload } from 'ant-design-vue'; // 新 import { NUpload } from 'naive-ui'; ``` 2. **文件列表类型**: ```typescript // 旧 import type { UploadFile } from 'ant-design-vue'; // 新 import type { UploadFileInfo } from 'naive-ui'; ``` 3. **状态值**: ```typescript // 旧 status: 'done'; // 新 status: 'finished'; ``` 4. **事件回调**: ```typescript // 旧 @remove="handleRemove" function handleRemove(file: UploadFile) { } // 新 @remove="handleRemove" function handleRemove(options: { file: UploadFileInfo; fileList: UploadFileInfo[] }) { } ``` 5. **自定义上传**: ```typescript // 旧 customRequest(info: UploadRequestOption) { info.onSuccess!(res); } // 新 customRequest(options: UploadCustomRequestOptions) { options.onFinish(); } ``` ## 更新日志 ### v1.0.0 (2025-01-16) - ✅ 将所有上传组件从 Ant Design Vue 重构为 Naive UI - ✅ 保持原有功能和 API 兼容性 - ✅ 优化代码结构和类型定义 - ✅ 修复所有 linter 错误 - ✅ 添加完整的文档说明