壹道文件柜上线:拖放上传、断点续传、二维码下载

島主 发布于 阅读:39 建站运维

2026-08-17 · 建站运维

昨晚(8/16)1dao.cc 家族又添新成员:文件柜 files.1dao.cc。从最初一个简单的上传页,一路迭代到带分片断点续传、二维码下载、图片预览的内部文件管理平台。这篇记录整个演进过程和几个关键设计。

一、为什么做文件柜

1dao.cc 的站点越来越多:主站、博客、禅道、发布平台、导航……日常总有文件要传:备份包、安装包、图片素材、临时文档。之前靠 scp 或聊天工具传来传去,既不统一也不安全。需要一个内部的文件中转站——能传、能管、能分享。

二、演进过程(四版迭代)

v1:基础版(上传/下载/删除)

第一版 20 分钟就上线了:一个 PHP 页面,支持多文件上传、列表、下载、删除。但很快发现问题——PHP 默认只允许传 2MB,nginx 写了 500M 也没用。改配置:upload_max_filesize 提到 500M。另外把可执行文件(.php/.sh/.py)全部拦掉,防止有人传个 webshell 上来。

v2:目录 + 分片断点续传

文件一多就要分目录。加了目录创建/浏览/删除。上传也重写了:分片上传,每片 4MB,逐片 POST,传完合并。这样:

v3:树状目录(做了又砍了)

按惯例给左侧加了目录树,懒加载、可展开收起。但实际用下来体验一般:层级深了展开收起时灵时不灵,而且树+列表双导航对文件管理其实没必要。最终砍掉树,回到面包屑+列表——这也是网盘类产品的标准形态。有些功能做了又删不是白费,至少确认了哪种交互更合适。

v4:拖放上传 + 二维码 + 预览 + hover 详情(当前版)

三、几个关键设计

安全

内部工具也得防一手:

分片断点续传

核心是服务端 upload_chunk / chunks / merge 三个接口:

1. 选择文件 → 生成 fileId(名称+大小+修改时间 hash)
2. 查询已传分片(断点检测)
3. 逐片上传到 .tmp/<fileId>/chunk_N
4. 全部传完 → merge 合并到目标目录,清理临时分片

与发布平台打通

代码推到 Gitee 私有仓(ccoad1-files),接入懒人发布平台(walle):检出 → releases/files/版本 → 软链切换。数据目录独立于 release,部署不影响已上传文件。以后改代码:push → 提交上线单 → 完成。

四、踩坑记录

坑 原因 解法
上传永远失败/超小 PHP upload_max_filesize 默认 2M 提到 500M(post_max_size 同步)
断点续传检测不到 fileId 不稳定 用名称+大小+修改时间做 hash
树展开时灵时不灵 懒加载缓存递归问题 缓存命中改异步回调;未加载目录也显示展开箭头
图片预览空白 下载接口强制 attachment 图片支持 inline 输出(view=1)

五、现状

至此 1dao.cc 内部体系:主站(对外)+ 博客(记录)+ 禅道(项目)+ 文件柜(文件)+ 凭据库(密码)+ 发布平台(部署)+ 导航(入口),各司其职,统一走 Gitee + walle 管理。

文章导出
预览框
生成预览中...

建站 部署 运维 踩坑

收到18条评论
avatar
大数据架构师 1 个月前
文件柜如果只管小文件还好,大文件和海量文件场景下,存储和检索要换方案。
commentator
島主 1 个月前
@大数据架构师:当前定位是轻量文件柜,大文件和海量场景会上对象存储,定位不同方案不同,不是一套打天下。
avatar
后端架构师 1 个月前
断点续传后端要管分片状态,状态如果存内存,服务重启分片全丢,要重新传。
commentator
島主 1 个月前
@后端架构师:分片状态存数据库不存内存,服务重启状态不丢,续传能接上。状态管理是关键,这点没偷懒。
avatar
前端架构师 1 个月前
拖放上传前端要做断点续传,浏览器兼容性是大坑,部分浏览器不支持分片上传。
commentator
島主 1 个月前
@前端架构师:分片上传用了兼容方案,不支持的浏览器回退表单上传,核心功能不依赖新特性,兼容性测过。
avatar
产品经理 1 个月前
并发上传没考虑,多人同时传大文件会怎样。
commentator
島主 1 个月前
@产品经理:并发用队列控制,同时上传上限可配。超限排队,不会压垮服务。
avatar
运维老兵 1 个月前
存储成本没算,大文件多了磁盘扛不住。
commentator
島主 1 个月前
@运维老兵:存储走对象存储不是本地盘,成本按量付费。小站量小费用可控,扩容无感。
avatar
安全客 1 个月前
二维码下载链接如果不过期,泄露了就是永久后门。
commentator
島主 1 个月前
@安全客:二维码链接有过期时间,且带一次性 token,下载后失效。不是永久链接。
avatar
前端小张 1 个月前
断点续传实现细节没写,大文件分片策略是关键。
commentator
島主 1 个月前
@前端小张:分片用秒传哈希加分片合并,细节在代码里。文章侧重架构,实现会拆独立篇。
avatar
架构师 1 个月前
文件柜功能简单,现有网盘产品都覆盖,自建是重复造轮子。
commentator
島主 1 个月前
@架构师:网盘产品是全家桶,文件柜只做拖放上传加断点续传加二维码下载三件事,轻量定位不同。
avatar
实用派 1 个月前
自建文件柜重复造轮子。Nextcloud 和 ownCloud 是成熟方案,功能完整社区活跃。自建一个只支持拖放和断点续传的工具意义不大,除非有特殊定制需求,否则用现成的更省心,自建维护成本最终会超过直接用现成方案。
commentator
島主 1 个月前
@实用派:Nextcloud 是全套云盘,文件柜是单功能轻量工具,定位不同。Nextcloud 资源占用重,文件柜专注拖放断点续传二维码三件事,部署成本低。用 Nextcloud 只为传文件,等于为了喝水装全套自来水系统。重复造轮子要看轮子是否过剩和场景是否匹配,不是所有自建都是重复。