Laravel8主机禁用symlink时如何将上传文件存到public_html的uploads目录
问题原因
- 你当前的配置和代码有三个核心问题:
- 自定义的uploads磁盘root路径没有明确指向public_html下的uploads目录,再加上你把Laravel核心文件放在了独立的files文件夹内,默认
public_path()会指向files/public而非public_html根目录 - 上传时调用的
storeAs方法没有指定使用你自定义的uploads磁盘,默认走的是Laravel自带的public磁盘,所以仍然会存储到storage目录 - 额外加的
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
相关产品推荐
相关产品推荐

