php - Failed image upload Laravel and Windows Server 2019

I am developing a Laravel application, which works fine locally but when deployed to Windows Server 2019, the image upload functionality fails with the below stack trace. I am using the Laravel Spatie Media library for handling the image uploads. The server PHP version is 7.4. I use the latest version of IIS.
if ($request->exists("product_logo")) {
$temp_file = $request->file('product_logo');
if (getimagesize($temp_file)) {
$allowedMimes = ['image/png', 'image/jpg', 'image/jpeg'];
$product_logo_mime = $temp_file->getMimeType();
if (in_array($product_logo_mime, $allowedMimes)) {
$product->clearMediaCollection();
$product->addMediaFromRequest('product_logo')->toMediaCollection();
}
}
}
RuntimeException: The file cannot be opened. in file C:\PROJECT_125\vendor\nyholm\psr7\src\Factory\Psr17Factory.php on line 44
#0 C:\PROJECT_125\vendor\symfony\psr-http-message-bridge\Factory\PsrHttpFactory.php(114): Nyholm\Psr7\Factory\Psr17Factory->createStreamFromFile()
#1 C:\PROJECT_125\vendor\symfony\psr-http-message-bridge\Factory\PsrHttpFactory.php(96): Symfony\Bridge\PsrHttpMessage\Factory\PsrHttpFactory->createUploadedFile()
#2 C:\PROJECT_125\vendor\symfony\psr-http-message-bridge\Factory\PsrHttpFactory.php(68): Symfony\Bridge\PsrHttpMessage\Factory\PsrHttpFactory->getFiles()
#3 C:\PROJECT_125\vendor\laravel\passport\src\Guards\TokenGuard.php(201): Symfony\Bridge\PsrHttpMessage\Factory\PsrHttpFactory->createRequest()
#4 C:\PROJECT_125\vendor\laravel\passport\src\Guards\TokenGuard.php(147): Laravel\Passport\Guards\TokenGuard->getPsrRequestViaBearerToken()
#5 C:\PROJECT_125\vendor\laravel\passport\src\Guards\TokenGuard.php(110): Laravel\Passport\Guards\TokenGuard->authenticateViaBearerToken()
#6 C:\PROJECT_125\vendor\laravel\passport\src\PassportServiceProvider.php(297): Laravel\Passport\Guards\TokenGuard->user()
#7 [internal function]: Laravel\Passport\PassportServiceProvider->Laravel\Passport\{closure}()
#8 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Auth\RequestGuard.php(58): call_user_func()
#9 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Auth\GuardHelpers.php(60): Illuminate\Auth\RequestGuard->user()
#10 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Auth\Middleware\Authenticate.php(63): Illuminate\Auth\RequestGuard->check()
#11 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Auth\Middleware\Authenticate.php(42): Illuminate\Auth\Middleware\Authenticate->authenticate()
#12 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): Illuminate\Auth\Middleware\Authenticate->handle()
#13 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(103): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#14 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Routing\Router.php(693): Illuminate\Pipeline\Pipeline->then()
#15 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Routing\Router.php(668): Illuminate\Routing\Router->runRouteWithinStack()
#16 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Routing\Router.php(634): Illuminate\Routing\Router->runRoute()
#17 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Routing\Router.php(623): Illuminate\Routing\Router->dispatchToRoute()
#18 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(166): Illuminate\Routing\Router->dispatch()
#19 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(128): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}()
#20 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#21 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#22 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#23 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#24 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#25 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle()
#26 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance.php(87): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#27 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle()
#28 C:\PROJECT_125\vendor\fruitcake\laravel-cors\src\HandleCors.php(57): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#29 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): Fruitcake\Cors\HandleCors->handle()
#30 C:\PROJECT_125\vendor\fideloper\proxy\src\TrustProxies.php(57): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#31 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): Fideloper\Proxy\TrustProxies->handle()
#32 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(103): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#33 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(141): Illuminate\Pipeline\Pipeline->then()
#34 C:\PROJECT_125\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(110): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter()
#35 C:\inetpub\PROJECT_125\index.php(52): Illuminate\Foundation\Http\Kernel->handle()
#36 {main}
This is my setup:
"require": {
"php": "^7.3|^8.0",
"ext-json": "*",
"fideloper/proxy": "^4.4",
"fruitcake/laravel-cors": "^2.0",
"guzzlehttp/guzzle": "^7.2",
"laravel/cashier": "^12.6",
"laravel/framework": "^8.12",
"laravel/passport": "^10.0",
"laravel/tinker": "^2.5",
"nyholm/psr7": "^1.3",
"pusher/pusher-php-server": "^4.1",
"spatie/laravel-medialibrary": "^9.0.0",
"spatie/laravel-permission": "^3.17",
"stripe/stripe-php": "^7.67",
"symfony/psr-http-message-bridge": "^2.0",
"twilio/sdk": "^6.14"
},
Any ideas? I searched all forums but found no answer... :(
Answer
Solution:
I've hit this issue with file permissions not being set properly in the past. Remember that your storage folder sits above your website public root. Check that IIS and PHP both have permission to write to this folder.
This may help: Add writing permission to PHP on IIS 7
Share solution ↓
Additional Information:
Link To Answer People are also looking for solutions of the problem: to enable extensions, verify that they are enabled in your .ini files
Didn't find the answer?
Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.
Similar questions
Find the answer in similar questions on our website.
Write quick answer
Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.