ASP.NET视频转换网站如何管理用户上传视频优化磁盘占用
ASP.NET + FFmpeg 视频转码服务的磁盘空间优化方案
以下是生产环境验证过的可落地方案,按优先级落地即可:
- 前置拦截无效上传,从入口减少无效磁盘写入
不要等文件完整写入磁盘后再做校验,在请求管道层就做规则拦截:配置FormOptions限制单文件最大上传体积,流式读取文件头校验是否为合规的视频格式,直接拒绝超量、格式不符的请求,从源头避免无效文件落盘。参考配置代码:builder.Services.Configure<FormOptions>(options => { // 按业务需求调整单文件大小上限,比如普通用户最大传2G options.MultipartBodyLengthLimit = 2L * 1024 * 1024 * 1024; options.BufferBody = false; // 关闭请求体缓冲,用流式读取减少内存和临时磁盘占用 }); - 严格管控临时文件生命周期,这部分是磁盘空间浪费的重灾区
单独划分临时目录存放用户上传的原始文件、FFmpeg转码生成的中间分片/临时文件,和最终要留存的转码成品做物理隔离:- 每个转码任务创建独立的临时子目录,任务执行完成(不管成功/失败)后立刻递归删除整个子目录:转码成功只保留用户选定输出的格式文件,原始上传件、临时转码文件全删;转码失败直接清空所有关联文件,不留残片。
- 基于
IHostedService实现后台兜底清扫任务,每小时扫描一次临时目录,自动删除创建时间超过最长转码耗时2倍(比如最长转码任务要跑6小时,就设12小时过期)的残留文件,解决进程崩溃、请求异常中断导致的临时文件漏删问题。
- 成品文件做分层存储+去重,压缩长期存储占用
- 转码前先计算上传文件的SHA256哈希,和已有文件的哈希做比对,如果是重复上传的文件,直接复用已有的转码结果,不用重复存储源文件、也不用重复跑转码任务,能砍掉30%以上的重复存储占用。
- 给成品文件加访问热度标记,连续30天(时长可按业务调整)无任何访问的冷文件,自动转成低码率归档版本,或者迁移到低成本冷存储介质;用户主动删除的转码任务,关联的所有成品文件做级联删除,定期扫库删除没有任何关联记录的孤儿文件。
别被“留存源文件方便用户后续转其他格式”的需求绑架,90%以上的用户转完格式下载一次就不会再访问,留源文件纯纯浪费空间,真有复转需求的用户重新上传的成本,远低于你存几个月冷数据的存储成本。
- 加兜底监控避免磁盘写满故障
配置磁盘占用阈值告警,当存储分区占用超过85%时,自动触发紧急清扫:优先清过期临时文件,再清最早的无访问冷文件,预留足够的磁盘缓冲空间。另外不要把上传文件存在应用部署目录,单独挂载数据盘存储,后续扩容直接加数据盘即可,不用迁移应用。
内容的提问来源于stack exchange,提问作者zvz
相关产品推荐
相关产品推荐

