前段时间靠 AI 编程工具打了下手、利用业余时间,做了个在线文件压缩的小站——FileMate(filemate.cn)。
一句话介绍:图片和视频都能"压到指定大小"——比如把报名照压到 100KB、把微信视频压到 25M,填个数字,一次到位。
这篇主要聊聊它做了啥,以及"压到指定大小"这个核心功能背后是怎么实现的。
一、起因
自己先被这事烦到了:平时做点事情的时候要上传图、视频,但是要求照片视频有不能那么大,手机拍的动辄好几兆;微信发视频又卡在 25M 发不出去。
找了一圈现成工具,总有别扭的地方——要么只能"智能压缩",压到多少算多少,压不到你要的那个精确数字;要么限制源文件不能过大;要么得下载安装软件;要么满屏广告、还强制注册。干脆自己撸一个干净的。
二、它能干嘛
- 压到指定大小(核心卖点):填个目标 KB / MB,它自动平衡画质和尺寸去逼近,一次压到位。这是和 TinyPNG 那类"智能压缩"最大的区别——后者压不到你指定的那个数。
- 图片、视频都能压:JPG / PNG / MP4 / MOV 都支持,不像很多工具只做图片。
- 免安装、免注册:网页打开就能用,电脑手机都行。
- 文件用完即焚:压缩完源文件自动删除、不留存,压缩后的文件可以自己手动删除,或者过期自动清除,压证件照这类敏感图也放心。
- 中英双站:中文 filemate.cn、英文 filemate.net。
三、"压到指定大小"是怎么实现的(重点)
这块是整个站最有技术含量的地方,思路是**"二分逼近 + 兜底降分辨率"**,图片和视频分开处理。
图片:
- JPEG:用 mozjpeg 的
cjpeg,在质量区间 [20, 95] 上做二分查找,找到"体积 ≤ 目标(留 2% 容差)且画质最高"的那个质量值; - PNG:用
pngquant,在 [5, 95] 区间二分; - 如果质量压到最低还超标,就按 0.8 倍逐步降分辨率,最多几轮,直到达标为止。
视频(ffmpeg):
- 先由目标体积反推码率:扣掉音频(96kbps)和容器开销(约 3%),再乘一个安全系数(0.94);
- 用 bpp(bits per pixel)判断画面会不会糊:低于阈值(0.055)就先按比例缩放分辨率(缩放系数 clamp 在 0.35~0.98,长宽取偶数,否则 yuv420p 编码会失败);
- 压完仍超标就再迭代一轮。
几个真实样本的实测效果:
- JPEG:246KB → 29.7KB(目标 30KB)
- PNG:1.16MB → 180KB(目标 200KB)
- 视频:652MB → 23MB(目标 25MB)
一个小细节:如果源文件本来就比目标小,直接原样返回、不压,避免"越压越大"。
四、技术栈
- 后端:Spring Boot + MyBatis-Plus + MySQL + Redis,文件存腾讯云 COS,压缩工具链是 ffmpeg / mozjpeg / pngquant;
- 前端:Vue 3 + Vite + Element Plus + Pinia,中英双语 i18n 是一套扁平 key 方案;
- 部署:一台云服务器 + Nginx,配置全走环境变量,敏感信息不进代码库。
五、一点感受
- AI 确实把"从 0 到能上线"的门槛拉低了很多,一个人利用业余时间也能把全栈小站做完;
- 但真正花时间的从来不是写 CRUD,而是这些细节:压到指定大小要兼顾画质、视频码率反推、大文件分片上传、过期清理、SEO……
- 代码 AI 能帮你写大半,可"这功能到底好不好用",还得自己一遍遍地试。
六、地址
FileMate:filemate.cn(电脑手机都能打开,免费、免注册)
做出来就是给人用的,欢迎体验。有 bug 或者建议,评论区告诉我,会持续迭代。