文件上传与存储是很多信息系统绕不开的功能,头像、附件、数据导入都会用到。不少同学在毕设里只写几行代码把文件丢进项目目录,等到部署迁移或多人访问时才暴露路径混乱、文件名冲突、无法鉴权等问题。把它当成独立模块设计,既能提升稳定性,也让论文实现章节更有内容。
动手写代码前先明确需求边界:支持哪些文件类型,单个文件多大,一次允许传几个,是否需要在线预览,谁可以下载,保留多久,删除是物理删除还是逻辑删除。把这些列成清单再决定方案,能少走很多弯路。如果系统存在多角色,还要区分公开资源与私有资源,私有文件必须鉴权后才能访问。
存储位置有三种常见思路。直接放在项目目录下最简单,但容器重建或代码更新后容易被清空。放在服务器独立数据目录并统一配置路径,适合单机部署的课程设计。对象存储适合文件量大、需要外链访问的场景,由服务端生成临时地址控制权限。数据库存二进制字段只建议用于极小文件,否则会拖慢备份与查询。
上传流程有几个值得实现的技术点。分片上传能缓解大文件超时,把文件切块分别提交,服务端记录已完成分片,从而实现断点续传。计算文件摘要可识别重复文件,但浏览器端计算耗性能,需要权衡。并发上传应限制请求数量。中断产生的临时分片要有清理机制,否则磁盘会被逐渐占满。
安全方面不能只看后缀名,应结合声明的内容类型与文件头判断真实类型,并统一重命名,避免文件名里的路径符号造成目录穿越。上传目录不要保留脚本执行权限,图片可以重新编码压缩,顺便去掉元数据。下载私有文件时由后端校验身份再返回临时地址,不要直接暴露真实路径。