laravel - 上传图片在本地主机上完美运行,在实时站点上不起作用(谷歌应用引擎和 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"
]
请协助。我不确定我在这里做错了什么。
解决方案
正如@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 应用程序的示例。
希望这可以帮助。
推荐阅读
- cucumber-java - Cucumber 在其他模块中找不到步骤定义
- java - 如何同步并防止线程 2 覆盖线程在文件中写入的内容?
- android - 如何在android studio中交替按钮的背景和文本颜色?
- python - Tensorflow 2 对象检测 API - 官方模型:无法更改 params_override 参数中的其他参数
- javascript - Javascript 部分初始化
- module - 如何在 rescript 中将类型构造函数设为私有(当前模块除外)?
- pytorch - PyTorch ROCm 已发布 - 如何选择 Radeon GPU 作为设备
- sql - 运算符导致空值问题
- javascript - 如何通过单击删除按钮上的悬停?
- macros - 在卸载模式下使用嵌套在宏中的 StrLoc