Laravel项目部署到主机后如何正确存储及访问public目录下的公共文件
解决方案
首先明确你当前部署后的目录结构如下,我们基于该结构给出方案:
public_html/ ├── uploads/ # 目标PDF存储目录,与Laravel项目文件夹同级 └── your_laravel_project/ # 存放在public_html内的Laravel核心代码 ├── app/ ├── public/ # 原Laravel自带public目录,现在public_path()默认指向此处 └── ...其他项目文件
问题根源是public_path()默认指向Laravel项目内的public目录,部署后路径不符合预期,可按以下三种方案解决:
方案1:直接修改上传路径(快速临时解决)
直接调整move方法的目标路径,通过base_path()跳转出项目根目录指向目标uploads文件夹:
// 先确保目录存在,避免写入失败 \File::ensureDirectoryExists(base_path('../uploads/pdfs/')); $pdf->move(base_path('../uploads/pdfs/'), $name);
base_path() 为Laravel项目根目录的绝对路径,加../即可跳出项目文件夹,指向上层的public_html目录。
方案2:重绑定public路径(无需修改业务代码)
如果希望保留原有public_path()的写法不用修改上传逻辑,可以在bootstrap/app.php中新增公共路径绑定:
// 加在return $app;之前 $app->bind('path.public', function() { // 指向项目文件夹外的public_html目录 return realpath(base_path().'/../'); });
配置生效后原有代码$pdf->move(public_path('uploads/pdfs/'), $name)可直接正常使用,自动写入public_html下的uploads目录。
方案3:新增自定义存储磁盘(规范可维护,推荐)
修改config/filesystems.php配置文件,在disks数组中新增自定义存储盘:
'disks' => [ // 原有其他磁盘配置保留 'uploads' => [ 'driver' => 'local', 'root' => base_path('../uploads'), 'url' => env('APP_URL').'/uploads', 'visibility' => 'public', ], ],
后续上传逻辑改用Storage门面实现,后续需要调整存储路径只要修改配置即可,不用改动业务代码:
\Storage::disk('uploads')->putFileAs('pdfs', $pdf, $name);
注意事项
- 提前确认目标
uploads目录的权限,确保web服务器运行用户(如www-data、apache)拥有写入权限,否则会出现权限报错。 - 可先打印
dd(base_path('../uploads/pdfs/'))校验输出路径是否和你预期的目标路径一致,确认无误后再运行上传逻辑。
内容的提问来源于stack exchange,提问作者Osama Amr
相关产品推荐
相关产品推荐

