首页 > 解决方案 > 图片上传 Laravel 和 Windows Server 2019 失败

问题描述

我正在开发一个 Laravel 应用程序,该应用程序在本地运行良好,但是当部署到 Windows Server 2019 时,图像上传功能失败并出现以下堆栈跟踪。我正在使用 Laravel Spatie Media 库来处理图像上传。服务器 PHP 版本是 7.4。我使用最新版本的 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}

 

这是我的设置:

"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"
},

有任何想法吗?我搜索了所有论坛,但没有找到答案... :(

标签: phplaravelwindows

解决方案


我在过去没有正确设置文件权限时遇到了这个问题。请记住,您的存储文件夹位于您的网站公共根目录之上。检查 IIS 和 PHP 是否都有权写入此文件夹。

这可能会有所帮助: 在 IIS 7 上向 PHP 添加写入权限


推荐阅读