无终端权限时,解决Hostinger上Laravel项目上传图片404无法显示的问题
无终端权限时,解决Hostinger上Laravel项目上传图片404无法显示的问题
兄弟我太懂你这种没终端权限的憋屈了,Hostinger共享主机这个限制确实烦,给你几个亲测有效的方案,挑适合自己的来:
方案一:直接修改上传路径到Public目录(最省心,推荐)
storage:link本质就是把storage/app/public和public/storage做个软链,那我们直接把图片传到Public目录下的Storage文件夹,彻底绕开软链需求:
- 手动创建目标文件夹:用Hostinger的文件管理器,找到你Laravel项目的
public目录(对应Hostinger上的public_html/backend/public),在里面手动搭建storage/images/company这个层级的文件夹。 - 调整上传逻辑或配置文件:
- 想最小改动代码的话,直接修改
config/filesystems.php里的public磁盘配置,把根目录从storage/app/public改成public_path('storage'):
这样你的上传Trait代码完全不用改,因为还是用'public' => [ 'driver' => 'local', 'root' => public_path('storage'), // 替换原来的storage_path('app/public') 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ],disk('public'),但文件会直接存在public/storage下,前端原来的/storage/images/company/xxx.jpg路径能直接访问到。 - 要是不想碰配置文件,也可以直接修改上传方法,用
move方法直接存到Public目录:
调用的时候public function uploadPicturePublic($picture, string $path){ $pictureName = Str::uuid() . '.' . $picture->getClientOriginalExtension(); // 直接存到public目录下的目标路径 $picture->move(public_path($path), $pictureName); return $pictureName; }$path传'storage/images/company'就行,和原来的逻辑完全兼容。
- 想最小改动代码的话,直接修改
方案二:用Laravel路由做图片代理(适合不想动上传路径的情况)
要是你还想把图片存在storage/app/public里,那可以写个路由来“代理”图片请求,让Laravel直接返回图片内容:
- 添加代理路由:在
routes/web.php(前端走web路由时)或者routes/api.php(前端走API路由时)里加这段代码:use Illuminate\Support\Facades\File; Route::get('storage/{path}', function ($path) { // 拼接真实的文件路径 $filePath = storage_path('app/public/' . $path); // 检查文件是否存在,不存在返回404 if (!File::exists($filePath)) { abort(404); } // 返回文件响应,自动处理MIME类型 return response()->file($filePath); })->where('path', '.*'); - 调整前端URL(仅api.php路由需要):要是路由加在
api.php里,记得前端的COMPANY_STORAGE_BASE_URL要加上/api前缀,比如改成:
加在export const COMPANY_STORAGE_BASE_URL = `${base_url_with_port}/api/storage/images/company`;web.php的话,前端URL完全不用改,直接用原来的就行。
方案三:试试Hostinger文件管理器创建软链(看运气,可能直接解决)
有的Hostinger共享主机其实支持在文件管理器里手动创建符号链接,你可以试试:
- 进入Hostinger的文件管理器,找到
public_html/backend/public目录(也就是Laravel的public目录)。 - 右键点击空白处,看看有没有“创建符号链接”的选项,有的话:
- 链接名称填
storage - 链接目标填
../storage/app/public(相对路径,指向你的storage/app/public目录)
- 链接名称填
- 要是能创建成功,那和跑
php artisan storage:link效果完全一样,所有代码都不用改,直接解决问题!
最后再提醒一句:不管用哪个方案,都记得给上传的文件夹设置正确的权限(一般文件夹755,文件644),用Hostinger文件管理器就能改,不然可能会出现权限不足的问题。




