当它是一个数组时,AWS S3 获得预先签名的 URL Guzzle“参数必须是数组类型,给定的对象”

Ros*_*ion 5 php amazon-s3 amazon-web-services

我不明白为什么这不起作用,我已经在互联网上搜索并找不到任何与我正在使用的特定命令相匹配的内容。

我基本上是在尝试从 Amazon S3 生成一个预先签名的 URL,并且我正在按照文档中的说明进行操作,但它不起作用。像这样的数组:['Key' => 'Value'] ...我在这里看到了另一个问题,其中解决的答案是使用 array() .... 但它不会改变任何东西。

它仍然给出这个错误:

[01-Jan-2016 13:28:56 America/Los_Angeles] PHP Catchable 致命错误:传递给 Guzzle\Service\Client::getCommand() 的参数 2 必须是数组类型,给定的对象,在 /Users/alex 中调用/Development/theshrineofdionysus-com/vendor/guzzle/guzzle/src/Guzzle/Service/Client.php 在第 76 行并在 /Users/alex/Development/theshrineofdionysus-com/vendor/guzzle/guzzle/src/Guzzle/Service 中定义/Client.php 第 79 行

这是我使用的与 S3 部分相关的代码。当我看到有关密钥、区域和存储桶的常量是正确的时,请相信我,因为我在其他地方使用它们的其他 S3 代码可以完美运行。

<?php
$s3 = Aws\S3\S3Client::factory(array(
  'key'    => AWS_ACCESS_KEY,
  'secret' => AWS_SECRET_KEY,
  'region' => AWS_REGION,
));
$cmd = $s3->getCommand('GetObject', array(
  'Bucket' => AWS_BUCKET,
  'Key' => $row['video_id']
));
$request = $s3->createPresignedRequest($cmd, '+120 minutes');
$url = (string) $request->getUri();
?>
Run Code Online (Sandbox Code Playgroud)

我也知道 $row['video_id'] 等于一个现有的文件名,因为那里没有这个代码,我把它回显出来它是正确的文件名。

这是我的 composer.json:

{
    "require": {
        "aws/aws-sdk-php": "2.*",
        "php": ">=5.2.0"
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我在另一个页面上运行良好的亚马逊代码:

$s3 = Aws\S3\S3Client::factory(array(
  'key'    => AWS_ACCESS_KEY,
  'secret' => AWS_SECRET_KEY,
  'region' => AWS_REGION
));
$objects = $s3->getIterator('ListObjects', array('Bucket' => AWS_BUCKET));
foreach ($objects as $object) {
  echo '<option value="' . $object['Key'] . '">' . $object['Key'] . '</option>' . PHP_EOL;
}
Run Code Online (Sandbox Code Playgroud)

gia*_*our 6

看起来您正在遵循 v3 的指南,但安装了 v2。您可以通过调用在 v2 中创建预签名 URL:$url = $s3->getObjectUrl(AWS_BUCKET, $row['video_id'], '+120 minutes');

可以在此处找到完整指南。