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


AWS S3 getting presigned URL Guzzle "argument must be of type array, object given" when it's an array

我不明白为什么这不起作用,我搜索了互联网,找不到任何与我使用的特定命令匹配的东西。

我基本上是在尝试从AmazonS3生成一个预签名的URL,我按照文档中的指示生成T,但它不起作用。。实际上不是对T,我是对T做的。文档说要把数组做成这样:['Key'=>'Value']。。。我在这里看到了另一个问题,解决的答案是使用array()。。。。但它不会改变任何事情。

它仍然给出这个错误:

[01-Jan-2016 13:28:56 America/Loss_Angeles]PHP可捕获的致命错误:传递给Guzzle''Service''Client::getCommand()的参数2必须是数组类型,给定对象,在第76行的/Users/alex/Development/thrineofdionysus.com/vendor/guzzle/guzzle/src/Guzle/Service/Client.php中调用,并在第79行的/Uusers/alex/Development/thrineOFdionysus com/vendor/gazzle/guuzzle/src/guzzle/Service/Client.php中定义

这是我正在使用的与S3部分相关的代码。当我看到关于键、区域和bucket的常量是正确的时,请相信我,因为我还有其他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();
?>

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

这是我的composer.json:

{
    "require": {
        "aws/aws-sdk-php": "2.*",
        "php": ">=5.2.0"
    }
}

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

$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;
}

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

完整的指南可以在这里找到。

相关文章: