You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 13:24:04