Skip to main content

Module upload

Module upload 

Source
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§

UploadOutcome 🔒
单条图片入库的结果。

Enums§

UploadError 🔒
流水线错误:映射到 HTTP 状态 + 脱敏消息(不泄露 SQL/路径细节)。

Constants§

ALLOWED_MIME_TYPES 🔒

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 原始字节,确保不是伪造扩展名的恶意文件。