Expand description
图片上传的 Axum 处理器。 图片上传:web 处理器 + 共享入库流水线。
两条入口共用 process_image_upload:
- web
POST /api/upload(cookie 鉴权,multipart)—— 见upload_image; - MCP
POST /api/mcp/upload(bearer 鉴权,multipart)—— 见mcp_upload_image; - MCP
upload_media工具(URL 抓取)—— 见src/mcp/tools/media.rs。
流水线:magic bytes 检 MIME → 大小校验 → 尺寸/像素校验 → SHA-256 内容去重
(命中即复用)→ GIF/WebP 解码校验 → spawn_blocking 转码(GIF/WebP 原样,
JPEG/PNG 仅在更小时转 WebP)→ 按日期落盘 → assets 登记(含并发竞态补偿)。
JPEG/PNG 自动转 WebP(若体积更小则保留原格式),GIF/WebP 保持原样。
文件按日期分目录存放于 uploads/。
内容去重(CAS):以原始上传字节的 SHA-256 为内容指纹(assets.content_hash,
唯一索引)。重复上传同一内容时复用已登记素材——同一行、同一文件,不重复
落盘,响应带 "reused": true;并发同内容上传由唯一索引 + ON CONFLICT 兜底。
仅精确去重:尺寸/压缩不同的视觉相似图不合并(那是感知哈希 pHash 的领域,
有意不做)。
本模块属于手动注册的 Axum 路由,仅在 feature = "server" 时可用。
Structs§
- Upload
Outcome 🔒 - 单条图片入库的结果。
Enums§
- Upload
Error 🔒 - 流水线错误:映射到 HTTP 状态 + 脱敏消息(不泄露 SQL/路径细节)。
Constants§
Functions§
- detect_
mime 🔒 - 从 magic bytes 检测 MIME 类型(不信任客户端声明的扩展名/Content-Type)。
- mcp_
upload_ 🔒error - MCP bearer 上传错误 → JSON 响应(与 web 端格式一致)。
- mcp_
upload_ image - 处理图片上传的 Axum handler(MCP 端,bearer token 鉴权)。
- mime_
for_ 🔒ext - mime_
to_ 🔒ext - process_
image_ 🔒upload - 单一图片入库流水线(web 上传 / MCP bearer 端点 / MCP URL 抓取共用)。
- transcode 🔒
- 在阻塞线程中执行转码,避免阻塞 async 运行时。 Bytes clone 廉价(引用计数 +1);join 失败(panic)时回退原格式。
- transcode_
image_ 🔒blocking - 转码核心(同步):GIF/WebP 保持原格式,JPEG/PNG 尝试转 WebP(更小才采用)。
- upload_
error 🔒 - 构造统一的 JSON 错误响应:
{ "success": false, "error": msg }。 - upload_
image - 处理图片上传的 Axum handler(web 端,cookie 鉴权)。
- validate_
raw_ 🔒image - 解码验证 GIF/WebP 原始字节,确保不是伪造扩展名的恶意文件。