7.5 前端文件组件
概述
前端文件能力集中在 components/Upload(上传组件族)与 utils/downloadFile(下载工具),配合两段式上传协议:选择文件即调 /api/upload/uploadFile 拿 temp URL,表单提交随业务接口转正。
组件清单(ui/src/components/Upload 等)
| 组件/工具 | 职责 |
|---|---|
| Upload | 上传组件族(单图/多图/普通文件形态) |
| Cropper / vue-cropper | 图片裁剪(头像上传场景:裁剪后上传) |
| importFile | 导入文件组件(Excel 导入入口,配合 Excel 组件) |
| utils/downloadFile | 文件下载工具(导出 URL 下载) |
| Editor(TinyMCE/Quill) | 富文本编辑器(内嵌图片上传协作,见 7.3) |
上传组件与后端协议的协作
text
1. 用户选择文件 → 前端 POST /api/upload/uploadFile(multipart,字段 file)
可带 type=image 走图片规则(魔数嗅探)
2. 后端 SaveTemp 落临时目录 → 返回 {originalName, fileExtension, fileType, fileSize, fileName, filePath, fileUrl}
3. 组件回显 fileUrl(预览)、originalName(文件名);表单数据持有 fileUrl
4. 表单提交(exampleAdd/articleAdd 等)→ 后端 spec.saveTransform
→ SaveFromTemp 把 temp URL 转正 → 库存相对路径
5. 详情回显 → 基座 GetFileUrl 补域名 → 组件直接展示关键认知:前端只持有 URL(temp 或正式),永远不关心物理路径;转正发生在业务表单保存时,不在上传时。
头像上传(Cropper 场景)
text
选择图片 → Cropper 裁剪 → 裁剪结果上传 /api/upload/uploadFile(type=image)
→ 得到 temp URL → 头像组件预览
→ 保存资料(index.updateProfile)→ 后端 SaveFileField(avatar, "user") 转正多图字段(article.images)
text
多图上传 → 每张走 uploadFile → 组件持有 URL 数组 → 表单逗号拼接
→ 后端 MultiFileFields 声明 → SaveFromTempMulti 逐个转正
→ 库存逗号分隔相对路径下载工具(utils/downloadFile)
text
导出接口返回文件 URL → downloadFile 触发浏览器下载
(导出文件在 /upload/temp/...,受 tempExpireDays 清理——及时下载)开发对接要点
| 场景 | 要点 |
|---|---|
| 新页面接上传 | 用 Upload 组件 + 表单字段持 URL;后端 spec 声明 FileFields + FileSaveDir |
| 图片类字段 | 上传带 type=image(后端魔数嗅探);后端注释含"图片"(生成器识别为图片列) |
| 多图 | MultiFileFields + 逗号分隔约定 |
| 富文本内图片 | 走 Editor 的上传通道(temp URL 入正文),保存时 Localize 统一转正 |
| 大小/类型拦截 | 前端可预校验(体验优化);真值以后端白名单与 maxSize 为准 |
排障
| 症状 | 原因 |
|---|---|
| 上传成功但保存后 404 | 转正失败或 domainUrl 配置错;查库中相对路径与 GetFileUrl |
| 上传被拒 | 扩展名/大小/嗅探——对照 file.* 配置(7.2 上传配置详解) |
| 预览正常发布后失效 | temp 已被 CleanTemp 清理——表单保存(转正)没发生或失败 |
| 多图只保存最后一张 | 前端未逗号拼接或后端未声明 MultiFileFields |