From a77416fbbe9a413b0c9c41f8e4f5e7de6139845a Mon Sep 17 00:00:00 2001 From: Hooray <304327508@qq.com> Date: Wed, 13 May 2026 09:00:14 +0800 Subject: [PATCH] =?UTF-8?q?feat(FaImageUpload):=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9=E4=B8=8A=E4=BC=A0=E5=92=8C=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E4=B8=8A=E4=BC=A0=E8=AF=B7=E6=B1=82=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component_example/image_upload/_demo3.vue | 16 +- .../component_example/image_upload/_demo4.vue | 30 ++ .../component_example/image_upload/_demo5.vue | 32 ++ .../component_example/image_upload/index.vue | 10 +- packages/components/index.ts | 1 + .../components/src/image-upload/README.md | 342 +++++++----------- .../components/src/image-upload/index.vue | 177 ++++----- 7 files changed, 289 insertions(+), 319 deletions(-) mode change 100755 => 100644 apps/example/src/views/component_example/image_upload/_demo3.vue create mode 100644 apps/example/src/views/component_example/image_upload/_demo4.vue create mode 100644 apps/example/src/views/component_example/image_upload/_demo5.vue diff --git a/apps/example/src/views/component_example/image_upload/_demo3.vue b/apps/example/src/views/component_example/image_upload/_demo3.vue old mode 100755 new mode 100644 index 4df58e2d..85034124 --- a/apps/example/src/views/component_example/image_upload/_demo3.vue +++ b/apps/example/src/views/component_example/image_upload/_demo3.vue @@ -1,6 +1,18 @@ + + diff --git a/apps/example/src/views/component_example/image_upload/_demo5.vue b/apps/example/src/views/component_example/image_upload/_demo5.vue new file mode 100644 index 00000000..de081bea --- /dev/null +++ b/apps/example/src/views/component_example/image_upload/_demo5.vue @@ -0,0 +1,32 @@ + + + diff --git a/apps/example/src/views/component_example/image_upload/index.vue b/apps/example/src/views/component_example/image_upload/index.vue index e1b1622b..757fdfdb 100755 --- a/apps/example/src/views/component_example/image_upload/index.vue +++ b/apps/example/src/views/component_example/image_upload/index.vue @@ -2,6 +2,8 @@ import Demo1 from './_demo1.vue' import Demo2 from './_demo2.vue' import Demo3 from './_demo3.vue' +import Demo4 from './_demo4.vue' +import Demo5 from './_demo5.vue' diff --git a/packages/components/index.ts b/packages/components/index.ts index fca34634..3df5f6c4 100755 --- a/packages/components/index.ts +++ b/packages/components/index.ts @@ -17,6 +17,7 @@ export { default as FaHoverCard } from './src/hover-card/index.vue' export { default as FaIcon } from './src/icon/index.vue' export * from './src/image-preview/index' export { default as FaImagePreview } from './src/image-preview/index.vue' +export type { UploadRequestOptions } from './src/image-upload/index.vue' export { default as FaImageUpload } from './src/image-upload/index.vue' export { default as FaInputOTP } from './src/input-otp/index.vue' export { default as FaInput } from './src/input/index.vue' diff --git a/packages/components/src/image-upload/README.md b/packages/components/src/image-upload/README.md index 3bfb0e8c..7ae02ae0 100644 --- a/packages/components/src/image-upload/README.md +++ b/packages/components/src/image-upload/README.md @@ -1,6 +1,6 @@ # FaImageUpload 图片上传 -专门用于图片上传的组件,支持预览、排序和粘贴上传。 +专门用于图片上传的组件,支持预览、排序、粘贴上传、自定义上传请求和文件夹上传。 ## 使用场景 @@ -15,22 +15,33 @@ | 属性 | 类型 | 默认值 | 说明 | |------|------|--------|------| -| `action` | `string` | **必需** | 上传接口地址 | -| `method` | `string` | `'post'` | 请求方法 | -| `headers` | `Headers \| Record` | `{}` | 请求头 | -| `data` | `Record` | `{}` | 额外表单数据 | -| `name` | `string` | `'file'` | 文件字段名 | -| `afterUpload` | `(response: any) => string \| Promise` | - | 上传成功后处理函数 | -| `multiple` | `boolean` | `false` | 是否支持多选 | -| `ext` | `string[]` | `[]` | 允许的图片格式 | -| `max` | `number` | `1` | 最大上传数量 | -| `dimension` | `{ width: number, height: number }` | - | 建议图片尺寸 | +| `action` | `string` | `''` | 默认上传请求地址,使用 `httpRequest` 时可不传 | +| `method` | `string` | `'post'` | 默认上传请求方法 | +| `headers` | `Headers \| Record` | `{}` | 默认上传请求头 | +| `data` | `Record` | `{}` | 默认上传附加表单数据 | +| `name` | `string` | `'file'` | 默认上传文件字段名 | +| `afterUpload` | `(response: any) => string \| Promise` | - | 上传成功后从响应中提取图片 URL | +| `beforeUpload` | `(file: File) => boolean \| Promise` | - | 上传前钩子,返回 `false` 时跳过该文件 | +| `httpRequest` | `(options: UploadRequestOptions) => any \| Promise` | - | 自定义上传请求,返回值会传给 `afterUpload` 和 `onSuccess` | +| `multiple` | `boolean` | `false` | 是否支持多选文件 | +| `max` | `number` | `1` | 最大上传数量,`0` 表示不限制 | | `width` | `number` | `100` | 预览图宽度 (px) | | `height` | `number` | `100` | 预览图高度 (px) | -| `size` | `number` | `5242880` (5MB) | 单张图片大小限制 | -| `hideTips` | `boolean` | `false` | 是否隐藏提示 | +| `directory` | `boolean` | `false` | 是否选择文件夹;启用后只能选择文件夹,文件夹内文件会扁平化上传 | | `disabled` | `boolean` | `false` | 是否禁用 | +```ts +interface UploadRequestOptions { + action: string + method: string + headers: Headers | Record + data: Record + name: string + file: File + onProgress: (percent: number) => void +} +``` + ### Model | 名称 | 类型 | 说明 | @@ -51,7 +62,7 @@ ## 粘贴上传 -将鼠标移入当前组件,或通过 `Tab` 聚焦当前组件后,可直接按 `Ctrl+V` / `Cmd+V` 粘贴剪贴板中的图片。粘贴上传会复用组件现有的数量、格式和大小校验逻辑。 +将鼠标移入当前组件,或通过 `Tab` 聚焦当前组件后,可直接按 `Ctrl+V` / `Cmd+V` 粘贴剪贴板中的图片。启用 `directory` 后,粘贴上传不可用。 ## 示例 @@ -59,46 +70,18 @@ ```vue -``` - -### 基础图片上传 - -```vue - - - -``` - -### 头像上传(单张) - -```vue - - - ``` @@ -107,106 +90,120 @@ const avatar = ref([]) ```vue -``` - -### 限制图片格式 - -```vue - - - -``` - -### 带尺寸提示 - -```vue - - - -``` - -### 处理上传结果 - -```vue - - - ``` -### 商品图片上传 +### 上传前校验 + +组件不再内置图片格式、大小或尺寸校验。如需校验,请通过 `beforeUpload` 实现。 ```vue +``` + +### 自定义上传请求 + +```vue + + + +``` + +### 文件夹上传 + +启用 `directory` 后,文件选择器只能选择文件夹。选择文件夹后,文件夹内的文件会作为扁平文件列表逐个上传。 + +```vue + + + ``` @@ -214,7 +211,7 @@ function handleSuccess(response: any) { ```vue ``` -### 带加载状态 - -```vue - - - -``` - -### 图片编辑表单 - -```vue - - - -``` - ## 注意事项 -1. **图片预览**:上传成功后可点击预览大图 -2. **图片排序**:多图上传时可拖拽排序(通过左右箭头按钮) -3. **删除图片**:鼠标悬停显示删除按钮 -4. **上传进度**:上传时显示进度条 -5. **格式校验**:根据 `ext` 属性校验图片格式 -6. **大小限制**:根据 `size` 属性校验图片大小 +1. **图片预览**:上传成功后可点击预览大图。 +2. **图片排序**:多图上传时可通过左右箭头调整顺序。 +3. **删除图片**:鼠标悬停显示删除按钮。 +4. **上传进度**:默认上传请求会自动更新进度;自定义 `httpRequest` 可调用 `onProgress` 更新进度。 +5. **上传校验**:组件不再内置格式、大小、尺寸校验,请使用 `beforeUpload` 自行处理。 diff --git a/packages/components/src/image-upload/index.vue b/packages/components/src/image-upload/index.vue index e67ee21e..3c3d16dd 100644 --- a/packages/components/src/image-upload/index.vue +++ b/packages/components/src/image-upload/index.vue @@ -1,45 +1,47 @@