DO + PostgreSQL
IIS
去重存储
访问日志
三个接口共用同一套鉴权:请求头 X-XSRF-TOKEN: Bearer <token>。令牌为三段式伪 JWT:签名 = md5(header + <签名盐> + payload),业务校验 = md5(sid + uid + exp + <业务盐>),并校验过期时间 exp。签名盐与业务盐为服务端私密配置,由平台与业务系统线下约定,不在本公开文档中披露。
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=命中已存在文件,未重复落盘
}
同上,扩展名自动从 base64 头识别,支持 jpg/png/gif/bmp/webp/ico。
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)。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
本站不提供查询后台,但所有上传与访问均会写入以下数据表,供业务系统自行对接统计。
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigserial | 主键 |
| sid | int | 系统ID |
| uid | varchar | 上传者(用户ID) |
| file_key | text | 预览长串(可还原 URL) |
| file_name | text | 原始文件名 |
| file_ext | varchar | 扩展名 |
| file_type | varchar | MIME 类型 |
| file_size | bigint | 文件大小(字节) |
| file_hash | char(32) | 内容 md5(去重依据) |
| storage_path | text | 磁盘绝对路径 |
| created_at / created_by | timestamptz / varchar | 上传时间 / 上传者 |
| updated_at / updated_by | timestamptz / varchar | 最后更新时间 / 最后更新者 |
| access_count | int | 访问次数(每次预览/下载 +1) |
| status | smallint | 1=有效(唯一去重生效),0=已删除 |
uq_mzy_files_sid_hash (sid, file_hash) WHERE status=1 在数据库层保证"同 sid 不重复保存"。| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigserial | 主键 |
| file_id | bigint | 关联 mzy_files.id(旧文件可能为 NULL) |
| file_key | text | 预览长串 |
| sid / uid | int / varchar | 系统 / 用户 |
| action | varchar | view(预览)/ download(下载) |
| access_time | timestamptz | 访问时间 |
| ip | varchar | 访客 IP |
| user_agent / referer | text | 浏览器标识 / 来源 |
| result | varchar | ok / 其它结果 |
| 常量 | 说明 |
|---|---|
| PG_HOST / PG_PORT / PG_DB / PG_USER / PG_PASS | PostgreSQL 连接参数(已指向 muzhiyun 库) |
| UPLOAD_ROOT | 上传根目录,已默认 D:/up/ |
| PREVIEW_DOMAIN | 预览域名,已默认 f.muzhiyun.com |
| LEGACY_SEED / LEGACY_SIGN / LEGACY_CNT | 旧式加密长串盐值,须与历史签发端一致(勿随意改) |
| ALLOWED_TYPES | 允许上传的文件类型 |
| ADMIN_TOKEN | 预留令牌(当前站未启用查询/建表后台,暂未使用) |