首页 > 解决方案 > 上传图片在本地主机上完美运行,在实时站点上不起作用(谷歌应用引擎和 laravel)

问题描述

我的项目在本地主机上运行良好,一旦我使用命令将其部署到实时服务器gcloud app deploy。部署可能运行成功,一旦我尝试在实时站点上上传图像图像,它就会抛出错误 500,当我检查我的日志时,我收到以下错误:

ErrorException: mkdir(): Permission denied
at mkdir (/app/app/Http/Controllers/Admin/Service/AddServiceController.php:74)
at App\Http\Controllers\admin\Service\AddServiceController->store (/app/app/Http/Controllers/Admin/Service/AddServiceController.php:74)
at call_user_func_array ([internal function])
at Illuminate\Routing\Controller->callAction (/app/vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54)
at Illuminate\Routing\ControllerDispatcher->dispatch (/app/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:45)
at Illuminate\Routing\Route->runController (/app/vendor/laravel/framework/src/Illuminate/Routing/Route.php:225)
at Illuminate\Routing\Route->run (/app/vendor/laravel/framework/src/Illuminate/Routing/Route.php:182)
at Illuminate\Routing\Router->Illuminate\Routing\{closure} (/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php:681)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:128)
at Illuminate\Auth\Middleware\Authorize->handle (/app/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authorize.php:45)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at App\Http\Middleware\LastUserActivity->handle (/app/app/Http/Middleware/LastUserActivity.php:26)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Illuminate\Routing\Middleware\SubstituteBindings->handle (/app/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php:41)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle (/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php:76)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Illuminate\View\Middleware\ShareErrorsFromSession->handle (/app/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php:49)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Illuminate\Session\Middleware\StartSession->handle (/app/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php:56)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle (/app/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php:37)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Illuminate\Cookie\Middleware\EncryptCookies->handle (/app/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php:66)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Illuminate\Pipeline\Pipeline->then (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:103)
at Illuminate\Routing\Router->runRouteWithinStack (/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php:683)
at Illuminate\Routing\Router->runRoute (/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php:658)
at Illuminate\Routing\Router->dispatchToRoute (/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php:624)
at Illuminate\Routing\Router->dispatch (/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php:613)
at Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure} (/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:165)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:128)
at Illuminate\Foundation\Http\Middleware\TransformsRequest->handle (/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:21)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Illuminate\Foundation\Http\Middleware\TransformsRequest->handle (/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:21)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle (/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php:27)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle (/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php:63)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Fruitcake\Cors\HandleCors->handle (/app/vendor/fruitcake/laravel-cors/src/HandleCors.php:36)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Fideloper\Proxy\TrustProxies->handle (/app/vendor/fideloper/proxy/src/TrustProxies.php:57)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Illuminate\Pipeline\Pipeline->then (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:103)
at Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter (/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:140)
at Illuminate\Foundation\Http\Kernel->handle (/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:109)
at {main} (/app/public/index.php:55)

第二个错误按摩:

Intervention\Image\Exception\NotWritableException: Can't write image data to path (/app/public/uploads/services/1593957045.jpeg)
at App\Http\Controllers\admin\Service\AddServiceController->store (/app/vendor/intervention/image/src/Intervention/Image/Image.php:150)
at call_user_func_array ([internal function])
at Illuminate\Routing\Controller->callAction (/app/vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54)
at Illuminate\Routing\ControllerDispatcher->dispatch (/app/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:45)
at Illuminate\Routing\Route->runController (/app/vendor/laravel/framework/src/Illuminate/Routing/Route.php:225)
at Illuminate\Routing\Route->run (/app/vendor/laravel/framework/src/Illuminate/Routing/Route.php:182)
at Illuminate\Routing\Router->Illuminate\Routing\{closure} (/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php:681)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:128)
at Illuminate\Auth\Middleware\Authorize->handle (/app/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authorize.php:45)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at App\Http\Middleware\LastUserActivity->handle (/app/app/Http/Middleware/LastUserActivity.php:26)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Illuminate\Routing\Middleware\SubstituteBindings->handle (/app/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php:41)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle (/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php:76)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Illuminate\View\Middleware\ShareErrorsFromSession->handle (/app/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php:49)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Illuminate\Session\Middleware\StartSession->handle (/app/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php:56)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle (/app/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php:37)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Illuminate\Cookie\Middleware\EncryptCookies->handle (/app/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php:66)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Illuminate\Pipeline\Pipeline->then (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:103)
at Illuminate\Routing\Router->runRouteWithinStack (/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php:683)
at Illuminate\Routing\Router->runRoute (/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php:658)
at Illuminate\Routing\Router->dispatchToRoute (/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php:624)
at Illuminate\Routing\Router->dispatch (/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php:613)
at Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure} (/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:165)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:128)
at Illuminate\Foundation\Http\Middleware\TransformsRequest->handle (/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:21)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Illuminate\Foundation\Http\Middleware\TransformsRequest->handle (/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:21)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle (/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php:27)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle (/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php:63)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Fruitcake\Cors\HandleCors->handle (/app/vendor/fruitcake/laravel-cors/src/HandleCors.php:36)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Fideloper\Proxy\TrustProxies->handle (/app/vendor/fideloper/proxy/src/TrustProxies.php:57)
at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure} (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
at Illuminate\Pipeline\Pipeline->then (/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:103)
at Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter (/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:140)
at Illuminate\Foundation\Http\Kernel->handle (/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:109)
at {main} (/app/public/index.php:55)

我的控制器:

        $service = new Add_Service;
        // Handle the user upload of avatar
        if($request->hasFile('service')){
            $image = $request->file('service');
            $filename = time().'.'.$image->getClientOriginalExtension();

            $destinationPath = 'uploads/services/';
            if (!file_exists(storage_path($destinationPath))) {
                mkdir(storage_path($destinationPath), 755, true);
            }

            Image::make($image->getRealPath())->resize(1000, 667, function ($constraint) {
                $constraint->aspectRatio();
            })->save($destinationPath.$filename);

            $service->image = $filename;
            $service->service_name = ucfirst(request('service_name'));
            $service->desc = ucfirst(request('service_desc'));
            $service->save();
         }

我的作曲家:

       "post-install-cmd": [
            "chmod -R 755 bootstrap\/cache",
            "php artisan cache:clear"
        ]

请协助。我不确定我在这里做错了什么。

标签: laravelgoogle-app-engine

解决方案


正如@STA 在评论中提到的那样,更改/app/public/uploads目录的权限将解决问题,您可以在 Cloud Shell 中使用以下命令来解决此问题:

sudo chmod -R a+w <directory>

但是,由于 App Engine 在其上运行的结构,这可能不是永久修复,也不是使用 App Engine 的最佳做法。

正如您在此社区答案中看到的:

App Engine 是托管 VM,这意味着即使您使文件夹在实例上可写,如果 App Engine 扩展或必须销毁您修改的实例,您也需要在新实例上进行更改。

因此,如果您使用此文件夹来存储临时文件,我建议您:

  • 开始使用不同的目录来存储它,例如 /tmp - 使用这种方法,您还将面临前面提到的扩展问题,但对于临时文件,将满足您的需求。

  • 使用 Cloud Storage Buckets 存储可供所有实例使用的持久文件。这是扩展应用程序的理想解决方案。您可以通过以下链接找到有关如何创建它的更多详细信息,在这里您可以获取有关如何将文件从 Cloud Storage 上传到 PHP 应用程序的示例。

希望这可以帮助。


推荐阅读