php 调用未定义的方法GuzzleHttp\Psr7\Uri::composeComponents()

of1yzvn4  于 2023-01-19  发布在  PHP
关注(0)|答案(3)|浏览(631)

我似乎无法在Laravel 5.4上进行简单的文件上传。我已使用S3的适当环境变量正确配置了文件系统。当我使用以下代码处理要上传的文件时:

$disk = Storage::disk('s3');
foreach ($request->allFiles() as $file) {
    $disk->putFileAs('file-requests', $file, $file->getClientOriginalName());
}

我得到这个错误:

(1/1) FatalThrowableError
Call to undefined method GuzzleHttp\Psr7\Uri::composeComponents()
in UriResolver.php (line 102)
at UriResolver::resolve(object(Uri), object(Uri))
in RestSerializer.php (line 206)
at RestSerializer->buildEndpoint(object(Operation), array('Bucket' => 'myBucket', 'Key' => 'file-requests/test_2MB.dump', 'Body' => object(Stream), 'ACL' => 'private', 'ContentType' => 'text/plain', 'ContentLength' => 2097152, '@http' => array()), array('body' => object(Stream), 'headers' => array('x-amz-acl' => 'private', 'Content-Type' => 'text/plain', 'Content-Length' => 2097152)))
in RestSerializer.php (line 48)
at RestSerializer->__invoke(object(Command))
in Middleware.php (line 97)
at Middleware::Aws\{closure}(object(Command), null)
in Middleware.php (line 81)
at Middleware::Aws\{closure}(object(Command), null)
in S3Client.php (line 421)
at S3Client::Aws\S3\{closure}(object(Command), null)
in S3Client.php (line 444)
at S3Client::Aws\S3\{closure}(object(Command), null)
in S3Client.php (line 378)
at S3Client::Aws\S3\{closure}(object(Command), null)
in S3Client.php (line 397)
at S3Client::Aws\S3\{closure}(object(Command), null)
in Middleware.php (line 55)
at Middleware::Aws\{closure}(object(Command), null)
in SSECMiddleware.php (line 59)
at SSECMiddleware->__invoke(object(Command), null)
in IdempotencyTokenMiddleware.php (line 77)
at IdempotencyTokenMiddleware->__invoke(object(Command))
in AwsClientTrait.php (line 65)
at AwsClient->executeAsync(object(Command))
in ObjectUploader.php (line 90)
at ObjectUploader->promise()
in S3ClientTrait.php (line 44)
at S3Client->uploadAsync('myBucket', 'file-requests/test_2MB.dump', resource, 'private', array('params' => array('ContentType' => 'text/plain', 'ContentLength' => 2097152)))
in S3ClientTrait.php (line 29)
at S3Client->upload('myBucket', 'file-requests/test_2MB.dump', resource, 'private', array('params' => array('ContentType' => 'text/plain', 'ContentLength' => 2097152)))
in AwsS3Adapter.php (line 582)
at AwsS3Adapter->upload('file-requests/test_2MB.dump', resource, object(Config))
in AwsS3Adapter.php (line 367)
at AwsS3Adapter->writeStream('file-requests/test_2MB.dump', resource, object(Config))
in Filesystem.php (line 122)
at Filesystem->putStream('file-requests/test_2MB.dump', resource, object(Config))
in FilesystemAdapter.php (line 118)
at FilesystemAdapter->put('file-requests/test_2MB.dump', resource, array())
in FilesystemAdapter.php (line 152)
at FilesystemAdapter->putFileAs('file-requests/test_2MB.dump', object(UploadedFile), 'test_2MB.dump')
in FileRequestsController.php (line 373)
at FileRequestsController->upload(object(Request), object(FileRequest))
at call_user_func_array(array(object(FileRequestsController), 'upload'), array(object(Request), 'file_request' => object(FileRequest)))
in Controller.php (line 55)
at Controller->callAction('upload', array(object(Request), 'file_request' => object(FileRequest)))
in ControllerDispatcher.php (line 44)
at ControllerDispatcher->dispatch(object(Route), object(FileRequestsController), 'upload')
in Route.php (line 203)
at Route->runController()
in Route.php (line 160)
at Route->run()
in Router.php (line 574)
at Router->Illuminate\Routing\{closure}(object(Request))
in Pipeline.php (line 30)
at Pipeline->Illuminate\Routing\{closure}(object(Request))
in BaseController.php (line 20)
at BaseController->App\Http\Controllers\{closure}(object(Request), object(Closure))
in Pipeline.php (line 131)
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
in Pipeline.php (line 53)
at Pipeline->Illuminate\Routing\{closure}(object(Request))
in LoginUsingOldPlm.php (line 39)
at LoginUsingOldPlm->handle(object(Request), object(Closure))
in Pipeline.php (line 148)
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
in Pipeline.php (line 53)
at Pipeline->Illuminate\Routing\{closure}(object(Request))
in SubstituteBindings.php (line 41)
at SubstituteBindings->handle(object(Request), object(Closure))
in Pipeline.php (line 148)
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
in Pipeline.php (line 53)
at Pipeline->Illuminate\Routing\{closure}(object(Request))
in Authenticate.php (line 43)
at Authenticate->handle(object(Request), object(Closure))
in Pipeline.php (line 148)
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
in Pipeline.php (line 53)
at Pipeline->Illuminate\Routing\{closure}(object(Request))
in VerifyCsrfToken.php (line 65)
at VerifyCsrfToken->handle(object(Request), object(Closure))
in Pipeline.php (line 148)
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
in Pipeline.php (line 53)
at Pipeline->Illuminate\Routing\{closure}(object(Request))
in ShareErrorsFromSession.php (line 49)
at ShareErrorsFromSession->handle(object(Request), object(Closure))
in Pipeline.php (line 148)
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
in Pipeline.php (line 53)
at Pipeline->Illuminate\Routing\{closure}(object(Request))
in StartSession.php (line 64)
at StartSession->handle(object(Request), object(Closure))
in Pipeline.php (line 148)
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
in Pipeline.php (line 53)
at Pipeline->Illuminate\Routing\{closure}(object(Request))
in AddQueuedCookiesToResponse.php (line 37)
at AddQueuedCookiesToResponse->handle(object(Request), object(Closure))
in Pipeline.php (line 148)
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
in Pipeline.php (line 53)
at Pipeline->Illuminate\Routing\{closure}(object(Request))
in EncryptCookies.php (line 59)
at EncryptCookies->handle(object(Request), object(Closure))
in Pipeline.php (line 148)
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
in Pipeline.php (line 53)
at Pipeline->Illuminate\Routing\{closure}(object(Request))
in Pipeline.php (line 102)
at Pipeline->then(object(Closure))
in Router.php (line 576)
at Router->runRouteWithinStack(object(Route), object(Request))
in Router.php (line 535)
at Router->dispatchToRoute(object(Request))
in Router.php (line 513)
at Router->dispatch(object(Request))
in Kernel.php (line 174)
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request))
in Pipeline.php (line 30)
at Pipeline->Illuminate\Routing\{closure}(object(Request))
in TransformsRequest.php (line 30)
at TransformsRequest->handle(object(Request), object(Closure))
in Pipeline.php (line 148)
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
in Pipeline.php (line 53)
at Pipeline->Illuminate\Routing\{closure}(object(Request))
in TransformsRequest.php (line 30)
at TransformsRequest->handle(object(Request), object(Closure))
in Pipeline.php (line 148)
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
in Pipeline.php (line 53)
at Pipeline->Illuminate\Routing\{closure}(object(Request))
in ValidatePostSize.php (line 27)
at ValidatePostSize->handle(object(Request), object(Closure))
in Pipeline.php (line 148)
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
in Pipeline.php (line 53)
at Pipeline->Illuminate\Routing\{closure}(object(Request))
in CheckForMaintenanceMode.php (line 46)
at CheckForMaintenanceMode->handle(object(Request), object(Closure))
in Pipeline.php (line 148)
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
in Pipeline.php (line 53)
at Pipeline->Illuminate\Routing\{closure}(object(Request))
in Pipeline.php (line 102)
at Pipeline->then(object(Closure))
in Kernel.php (line 149)
at Kernel->sendRequestThroughRouter(object(Request))
in Kernel.php (line 116)
at Kernel->handle(object(Request))
in index.php (line 52)

但是这个方法已经定义了。也许我遗漏了一些东西,但我看不到它。任何帮助都是感激的。在UriResolver.php的第102行添加以下内容:

$_uri = new Uri();
var_dump(method_exists($_uri, 'composeComponents'));
exit;

在我的新Laravel安装返回:

/home/vagrant/Code/test-aws/vendor/guzzlehttp/psr7/src/UriResolver.php:103:boolean true

在我的大型项目上,它说:

/home/vagrant/Code/plm/vendor/guzzlehttp/psr7/src/UriResolver.php:103:boolean false

即使它确实存在。我相信真正的问题是什么会使类上的静态方法不存在或不可调用。将方法移动到变量中我能够完成我的文件上传到AWS,但这是各种各样的错误:

$composeComponents = function ($scheme, $authority, $path, $query, $fragment) {
    $uri = '';

    // weak type checks to also accept null until we can add scalar type hints
    if ($scheme != '') {
        $uri .= $scheme . ':';
    }

    if ($authority != ''|| $scheme === 'file') {
        $uri .= '//' . $authority;
    }

    $uri .= $path;

    if ($query != '') {
        $uri .= '?' . $query;
    }

    if ($fragment != '') {
        $uri .= '#' . $fragment;
    }

    return $uri;
};

//$_uri = new Uri();
//var_dump($_uri);
//var_dump(method_exists($_uri, 'composeComponents'));
//exit;

//return new Uri(Uri::composeComponents(
return new Uri($composeComponents(
    $base->getScheme(),
    $targetAuthority,
    $targetPath,
    $targetQuery,
    $rel->getFragment()
));
zlwx9yxi

zlwx9yxi1#

这是一个自动加载问题。
我有一个旧的网站在Laravel有自己的自动加载。这发生是因为一个中间件总是包括一个文件从旧的网站,这造成了不规则的行为。

bjg7j2ky

bjg7j2ky2#

尝试删除vendor/目录并重新安装所有Composer依赖项。
如果您使用的是"guzzlehttp/guzzle": "~6.2",应该没问题。

ocebsuys

ocebsuys3#

如果问题是相关的,并且您使用Laravel,则无需删除和重新安装任何内容。

$response->transferStats->getHandlerStats()['url'];

如果错误,则解析url:
https://doc.hotexamples.com/class/guzzlehttp.psr7/Uri#method-getPath

$parse = $response->transferStats->getRequest()->getUri();
    $res = [
        'scheme' => $parse->getScheme().'://',
        'host' => $parse->getHost(),
        'path' => $parse->getPath()
    ];
    return implode('', $res);

$response -这是你从服务器得到的响应,可以是***json***的形式,看看你敲了谁的服务器。
第二种选择对我很有效。我希望我帮助了别人。

相关问题