startup-plan/技术设计/ios-file-upload-import-flow.md
WangDL 0eb5f53873 docs: iOS integration audit report + 5 CAPI docs + nginx fix
- iOS integration readiness audit (blocker list, module map, deployment check)
- CAPI contract for iOS (15 modules, 80+ endpoints)
- CAPI error codes and status enums
- iOS auth flow, file upload import flow, learning review flow
- Web product page nginx fix (reenable longde.cloud)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-25 16:55:22 +08:00

99 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# iOS 文件上传与导入流程
> 版本0.1.0 | 更新2026-05-24
## 完整流程
```
iOS App API Server COS (腾讯云) Worker
======= ========== ============ ======
1. 获取上传凭证
POST /api/files/upload-url
{ filename, mimeType, sizeBytes }
──────────────────────────► 校验文件类型9 种)
校验大小≤20MB
生成预签名 PUT URL
◄────────────────────────── { uploadUrl, objectKey,
bucket, region, expiresIn }
2. 直传文件到 COS
PUT <uploadUrl>
Content-Type: <mimeType>
[binary file data]
───────────────────────────────────────────────────────► 文件存入 COS
3. 确认上传完成
POST /api/files/complete
{ objectKey, checksum? }
──────────────────────────► COS headObject 验证
创建 UploadedFile 记录
◄────────────────────────── { id, filename, sizeBytes,
mimeType }
4. 创建知识源(自动触发导入)
POST /api/knowledge-bases/:kbId/sources
{ fileId, title, type, originalFilename, mimeType }
──────────────────────────► 创建 KnowledgeSource
自动创建 DocumentImport
(status=QUEUED)
◄────────────────────────── { id, title, parseStatus }
5. 轮询导入状态
GET /api/imports/:importId/status
──────────────────────────► 查 Redis 实时状态
→ 回退 DB
◄────────────────────────── { id, status, progress,
message }
6. Worker 处理
下载文件
AI 解析提取
创建知识点
更新状态→COMPLETED
7. 轮询导入状态
GET /api/imports/:importId/status
◄────────────────────────── { status: "COMPLETED",
progress: 100,
message: "成功提取 N 个知识点" }
```
## 允许的文件类型
| 格式 | MIME |
|------|------|
| PDF | `application/pdf` |
| TXT | `text/plain` |
| Markdown | `text/markdown`, `text/x-markdown` |
| CSV | `text/csv` |
| Word | `application/vnd.openxmlformats-officedocument.wordprocessingml.document` |
| Excel | `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet` |
| PNG | `image/png` |
| JPEG | `image/jpeg` |
| WebP | `image/webp` |
**大小上限:** 20MB
## 导入状态枚举
| 状态 | 含义 | 可操作 |
|------|------|--------|
| `QUEUED` | 排队中 | 轮询等待 |
| `CLAIMED` | 已被 Worker 认领 | 轮询等待 |
| `DOWNLOADING` | 下载中 | 轮询等待 |
| `PARSING` | 解析中 | 轮询等待 |
| `CHUNKING` | 分块中 | 轮询等待 |
| `EMBEDDING` | 向量化中 | 轮询等待 |
| `COMPLETED` | 完成 | 可查看结果 |
| `FAILED` | 失败(会重试 3 次) | 等待自动重试 |
| `FAILED_FINAL` | 最终失败 | 需重新导入 |
## iOS 实现要点
1. **直接 PUT 到 COS**:使用 URLSession 的 `uploadTask(with:fromFile:)` 或 Alamofire 的 `upload(data:to:)`
2. **预签名 URL 有过期时间**`expiresIn` 秒内有效,拿到后立即使用
3. **支持进度回调**:大文件上传时建议显示进度条
4. **Checksum 可选但推荐**:上传完成后传 `checksum`SHA-256确保完整性
5. **导入轮询间隔建议**:初始 2s逐步退避到 5s