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

Laravel8主机禁用symlink时如何将上传文件存到public_html的uploads目录

问题原因
  • 你当前的配置和代码有三个核心问题:
  1. 自定义的uploads磁盘root路径没有明确指向public_html下的uploads目录,再加上你把Laravel核心文件放在了独立的files文件夹内,默认public_path()会指向files/public而非public_html根目录
  2. 上传时调用的storeAs方法没有指定使用你自定义的uploads磁盘,默认走的是Laravel自带的public磁盘,所以仍然会存储到storage目录
  3. 额外加的Storage::disk('uploads')->put代码是多余的,和主上传逻辑无关

修正步骤

1. 修改config/filesystems.php配置

调整uploads磁盘的root参数,直接定位到public_html下的uploads目录:

'uploads' => [
    'driver' => 'local',
    // 适配你把Laravel核心放在files文件夹、public文件在根目录的结构
    'root'   => realpath(public_path() . '/../') . '/uploads',
    // 如果你确认public_path()本身就指向public_html根目录,可以直接替换为public_path('uploads')
    // Cpanel环境也可以直接写绝对路径,格式为'/home/你的cpanel用户名/public_html/uploads'
    'url' => env('APP_URL') . '/uploads',
    'visibility' => 'public',
],

2. 修正VideoController的上传代码

删除多余的put代码,指定上传时使用uploads磁盘,调整存储路径和返回值:

public function uploadVideo (Request $request) {
    $target = $request['target'];

    // 获取带后缀的原文件名
    $fileNameWithExt = $request->file($target)->getClientOriginalName();
    // 获取纯文件名
    $filename = pathinfo($fileNameWithExt, PATHINFO_FILENAME);
    // 获取文件后缀
    $extension = $request->file($target)->getClientOriginalExtension();
    // 生成最终存储的文件名
    $fileNameToStore = $filename.'_'.time().'.'.$extension;
    // 上传时指定使用自定义的uploads磁盘,路径直接写目标分类即可
    $path = $request->file($target)->storeAs($target, $fileNameToStore, 'uploads');
    
    // 返回可直接访问的前端路径
    return 'uploads/'. $target .'/'.$fileNameToStore;
}

3. 手动创建uploads目录并设置权限

到Cpanel的文件管理器中,在public_html根目录新建uploads文件夹,权限设置为755,确保Laravel有写入权限。


生效验证

修改完成后执行php artisan config:clear清除配置缓存,再测试上传,文件会直接存储到public_html/uploads/对应分类目录下,不需要symlink即可直接通过域名/uploads/xxx/文件名访问。

内容的提问来源于stack exchange,提问作者Amir Hossein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:36:04