拇指云文件 · 对接指引

DO + PostgreSQL

IIS

去重存储

访问日志

一、系统架构

二、上传方法

三个接口共用同一套鉴权:请求头 X-XSRF-TOKEN: Bearer <token>。令牌为三段式伪 JWT:签名 = md5(header + <签名盐> + payload),业务校验 = md5(sid + uid + exp + <业务盐>),并校验过期时间 exp。签名盐与业务盐为服务端私密配置,由平台与业务系统线下约定,不在本公开文档中披露。

1) 图片(base64)— Up.do

POST https://file.muzhiyun.com/Up.do
Header: X-XSRF-TOKEN: Bearer <token>
Form:  img  = data:image/jpeg;base64,/9j/4AAQ...  (含 data URI 前缀)
        name = example.jpg

返回:
{
  "ok":       1,
  "msg":      "d1{sid}d{uid}{md5}.{ext}",   // 短串(建议存储,与参考服务器一致)
  "key":      "d1{sid}d{uid}{md5}.{ext}",   // 同 msg
  "file":     "{md5}.{ext}",                // 纯物理文件名(磁盘上的文件名)
  "file_key": "<完整加密长串>",              // = url 去掉域名部分
  "url":      "https://f.muzhiyun.com/<完整加密长串>",
  "dup":      0                             // 1=命中已存在文件,未重复落盘
}

2) 图片(多格式)— Up_mp.do

同上,扩展名自动从 base64 头识别,支持 jpg/png/gif/bmp/webp/ico。

3) 文档 / 通用文件 — Up_PDF.do

POST https://file.muzhiyun.com/Up_PDF.do
Header: X-XSRF-TOKEN: Bearer <token>
Form:  file = (二进制文件)
        name = report.pdf

支持类型见服务端 config ALLOWED_TYPES(pdf/doc/docx/xls/xlsx/ppt/pptx/txt/csv/zip/mp3/mp4 ...)
上限 100MB
去重说明:上传内容按 md5(文件内容) 计算,同一 sid 下相同内容只保存一份。已存在时直接复用旧记录并返回 dup=1,不再占用服务器空间。物理文件名即内容哈希,天然唯一。
该存哪一个(建议必读):上传返回的是短串(msg/key,形如 d1{sid}d{uid}{md5}.{ext}),本身不是可访问地址;url 才是带签名的完整可用地址(缩图 / 下载参数追加尾部:?s=300 / ?act=download)。
建议业务库持久存储短串,分发时再按需签出 URL。原因:
① 域名解耦——预览域名可能调整(本项目已由 f.zpzzq.com.cn 迁至 f.muzhiyun.com),硬编码完整 URL 会导致历史数据全部失效;
② 可自定义有效期——完整长串第 11~20 位是过期时间戳,业务方可凭线下约定的签名盐自签「限时」链接,到期即回退过期占位图;平台默认签发的链接为长期有效;
③ file 字段给出纯物理文件名,便于与磁盘文件(D:\up\{sid}\{h0}\{h1}\{md5}.{ext})直接对应。
平台自身在 mzy_files.file_key 中存的是完整长串。
⚠ 常见错误:切不可用「https://f.muzhiyun.com/ + 短串」直接拼 URL。短串不含签名段,会被判为无效 key 并回退默认占位图(表现为"文件明明上传成功却显示占位图")。
正确做法二选一:① 直接使用接口返回的 url(平台已签好,长期有效);② 用短串按线下约定的签名规则自签成完整长串后再拼域名——这也是「限时 / 限次」链接的实现方式。

三、预览 / 下载方法

上传成功返回的 url 即完整预览地址,直接 <img src> 或浏览器打开即可:

https://f.muzhiyun.com/<加密长串>          # 原图/原文件预览

# 缩图(仅图片):s=目标宽度
https://f.muzhiyun.com/<加密长串>?s=300

# 触发下载(Content-Disposition: attachment)
https://f.muzhiyun.com/<加密长串>?act=download
旧链接(历史加密长串)形态完全一致,迁到 f.muzhiyun.com 后依旧可访问;旧文件在 E:\up,新文件在 D:\up,show.do 会自动回退查找。
有效期:完整长串第 11~20 位为过期时间戳——平台默认签发的是长期有效链接;业务方自签的限时链接到期后返回过期占位图(nopic02)。

四、数据表结构

本站不提供查询后台,但所有上传与访问均会写入以下数据表,供业务系统自行对接统计。

mzy_files(文件主表)

字段类型说明
idbigserial主键
sidint系统ID
uidvarchar上传者(用户ID)
file_keytext预览长串(可还原 URL)
file_nametext原始文件名
file_extvarchar扩展名
file_typevarcharMIME 类型
file_sizebigint文件大小(字节)
file_hashchar(32)内容 md5(去重依据)
storage_pathtext磁盘绝对路径
created_at / created_bytimestamptz / varchar上传时间 / 上传者
updated_at / updated_bytimestamptz / varchar最后更新时间 / 最后更新者
access_countint访问次数(每次预览/下载 +1)
statussmallint1=有效(唯一去重生效),0=已删除
唯一索引 uq_mzy_files_sid_hash (sid, file_hash) WHERE status=1 在数据库层保证"同 sid 不重复保存"。

mzy_files_log(访问日志)

字段类型说明
idbigserial主键
file_idbigint关联 mzy_files.id(旧文件可能为 NULL)
file_keytext预览长串
sid / uidint / varchar系统 / 用户
actionvarcharview(预览)/ download(下载)
access_timetimestamptz访问时间
ipvarchar访客 IP
user_agent / referertext浏览器标识 / 来源
resultvarcharok / 其它结果

五、需要你改的配置(服务端 config.do)

常量说明
PG_HOST / PG_PORT / PG_DB / PG_USER / PG_PASSPostgreSQL 连接参数(已指向 muzhiyun 库)
UPLOAD_ROOT上传根目录,已默认 D:/up/
PREVIEW_DOMAIN预览域名,已默认 f.muzhiyun.com
LEGACY_SEED / LEGACY_SIGN / LEGACY_CNT旧式加密长串盐值,须与历史签发端一致(勿随意改)
ALLOWED_TYPES允许上传的文件类型
ADMIN_TOKEN预留令牌(当前站未启用查询/建表后台,暂未使用)
安全提醒:上传令牌与各类签名盐值属于敏感凭证,生产环境请通过密钥管理下发,不要硬编码进前端;库文件(config/keys/db/auth/files/util)已禁止通过 Web 直接访问,仅作内部引用。