unicloud云存储文件默认永久保留,需通过云函数+定时触发器实现手动清理;上传时用服务端时间记录createdat/expiresat,清理时按serverdate比对并分批删除,避免超时与路径错误。

uniCloud云存储的文件默认不会自动删除
uniCloud云存储(阿里云OSS或腾讯云COS后端)本身不提供按时间自动清理文件的原生能力,uploadFile 上传后文件永久保留,除非手动调用 deleteFile 或通过控制台/后台脚本清理。所谓“生命周期控制”,实际是开发者主动实现的定时清理逻辑,不是服务端开箱即用的功能。
用云函数 + 定时触发器模拟生命周期
最常用且可控的方式:在云函数中查询并删除过期文件,再用定时触发器(如每天凌晨2点)自动执行。关键点在于如何标记和识别“过期”:
- 上传时在数据库记录
fileId、url、createdAt(ISO字符串),并可选加expiresAt字段(如new Date(Date.now() + 7 * 24 * 60 * 60 * 1000)) - 清理云函数中用
db.collection('files').where({ expiresAt: db.command.lt(new Date()) }).get()查出过期记录 - 对每条记录调用
uniCloud.deleteFile({ fileID: xxx })删除云存储文件,再用.remove()清数据库条目 - 注意:阿里云OSS后端要求
fileID必须是上传时返回的完整路径(如cloud://xxx/file.jpg),不能只传文件名
避免直接依赖客户端时间戳
前端 new Date() 不可靠,时区、设备时间错误会导致 expiresAt 计算偏差。所有时间相关逻辑必须在云函数内用服务端时间生成和比对:
- 上传时,云函数里用
new Date()写入createdAt和expiresAt - 清理时,同样用云函数内
new Date()做db.command.lt()比较,不传客户端时间 - 如果需按“上传后N天”清理,存
createdAt即可,查时用db.command.lt(db.serverDate().add(-7, 'd'))(支持 serverDate 的云平台)
大文件或高频上传场景下的性能提醒
单次清理不宜处理过多文件。OSS/COS的 deleteFile 是串行调用,100个文件可能耗时数秒,超时风险高:
- 限制每次最多删 20–50 条,用
skip/limit分页处理 - 清理函数返回后继续下一批,可用
setTimeout或递归调用(注意云函数 60 秒超时) - 更稳妥的做法:把待删
fileID推到队列(如 Redis 或另一个集合),另起轻量函数批量消费 - 别在
onLaunch或页面 onLoad 里触发清理——这是常见误用,会拖慢首屏且不可控
实际运行中,最容易被忽略的是 fileID 格式校验和分批控制。一次传错路径或硬删 200 个文件,既失败又难排查。先小步验证,再铺开定时任务。










