
最近处理一个企业后台上传附件的问题,用户上传合同后,接口明确返回"上传成功",数据库里也有文件记录,但重新打开详情页时,图片和 PDF 全部显示 404。刚开始怀疑是前端地址拼错,后来直接登录服务器检查,文件其实已经真实存在。
问题出在保存路径和访问路径不是一回事。PHP 把文件写到了项目里的 storage/uploads 目录,但 Nginx 的网站运行目录指向 public。程序生成访问地址时却直接拼成 /storage/uploads/xxx.pdf,浏览器访问的实际上是 public/storage/uploads,这个目录根本不存在,所以文件虽然上传成功,网页却永远找不到。
后来把文件存储规则重新整理了一遍。上传时只保存相对路径,服务器上的真实目录和前端访问 URL 分开配置。公开文件统一放到可访问目录,私有合同、客户资料则不再直接暴露地址,而是通过 PHP 接口校验登录状态和权限后再读取文件。同时把文件是否存在、目录是否可写、生成后的访问地址都加入上传日志。
这类问题在 PHP 项目部署时很常见,尤其是宝塔、Laravel 或者项目存在 public 运行目录时。看到"上传成功"并不能说明文件一定能访问,还要确认三个东西:文件到底存在哪里、Nginx 从哪里对外提供文件、程序最后返回的 URL 指向哪里。
#PHP开发 #文件上传 #Nginx #后台系统