You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无终端权限时,解决Hostinger上Laravel项目上传图片404无法显示的问题

无终端权限时,解决Hostinger上Laravel项目上传图片404无法显示的问题

兄弟我太懂你这种没终端权限的憋屈了,Hostinger共享主机这个限制确实烦,给你几个亲测有效的方案,挑适合自己的来:

方案一:直接修改上传路径到Public目录(最省心,推荐)

storage:link本质就是把storage/app/publicpublic/storage做个软链,那我们直接把图片传到Public目录下的Storage文件夹,彻底绕开软链需求:

  1. 手动创建目标文件夹:用Hostinger的文件管理器,找到你Laravel项目的public目录(对应Hostinger上的public_html/backend/public),在里面手动搭建storage/images/company这个层级的文件夹。
  2. 调整上传逻辑或配置文件
    • 想最小改动代码的话,直接修改config/filesystems.php里的public磁盘配置,把根目录从storage/app/public改成public_path('storage')
      'public' => [
          'driver' => 'local',
          'root' => public_path('storage'), // 替换原来的storage_path('app/public')
          'url' => env('APP_URL').'/storage',
          'visibility' => 'public',
      ],
      
      这样你的上传Trait代码完全不用改,因为还是用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直接返回图片内容:

  1. 添加代理路由:在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', '.*');
    
  2. 调整前端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文件管理器就能改,不然可能会出现权限不足的问题。

火山引擎 最新活动