Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建amazon aws s3预签名url PHP_Php_Amazon S3_Pre Signed Url - Fatal编程技术网

创建amazon aws s3预签名url PHP

创建amazon aws s3预签名url PHP,php,amazon-s3,pre-signed-url,Php,Amazon S3,Pre Signed Url,根据这个链接,我可以轻松地创建一个预先签名的链接,只需将生命周期添加到getObjectUrl $signedUrl = $client->getObjectUrl($bucket, 'data.txt', '+10 minutes'); // > https://my-bucket.s3.amazonaws.com/data.txt?AWSAccessKeyId=[...]&Expires=[...]&Signature=[...] 但是我得到了一个简单的url,

根据这个链接,我可以轻松地创建一个预先签名的链接,只需将生命周期添加到getObjectUrl

$signedUrl = $client->getObjectUrl($bucket, 'data.txt', '+10 minutes');
// > https://my-bucket.s3.amazonaws.com/data.txt?AWSAccessKeyId=[...]&Expires=[...]&Signature=[...]
但是我得到了一个简单的url,没有awsaccesskeyid和expires参数

这是我的密码:

$bucket = 'imagenesfc';
$keyname = 'NASimagenes/codigoBarraBoleto/1001000098.png';
$filepath = 'NASimagenes/codigoBarraBoleto';

// Instantiate the client.
$s3 = S3Client::factory(array(
    'version' => 'latest',
    'region' => 'us-west-1'
));
 $signedUrl = $s3->getObjectUrl($bucket, $keyname,'+10 minutes');
// > https://my-bucket.s3.amazonaws.com/data.txt?AWSAccessKeyId=[...]&Expires=[...]&Signature=[...]
 echo $signedUrl."<br>";
$bucket='imagenesfc';
$keyname='NASimagenes/codigobaraboleto/1001000098.png';
$filepath='NASimagenes/codigobarboleto';
//实例化客户端。
$s3=s3客户端::工厂(阵列(
'版本'=>'最新',
“地区”=>“美国西部1”
));
$signedUrl=$s3->getObjectUrl($bucket,$keyname,“+10分钟”);
// > https://my-bucket.s3.amazonaws.com/data.txt?AWSAccessKeyId=[…]过期=[…]签名=[…]
echo$signedUrl.“
”;
编辑:我有AWS\u访问权\u密钥\u ID和AWS\u机密\u访问权\u密钥作为环境变量

我的回声看起来像:


出什么问题了?

好吧,如果有人像我一样对此有任何问题,下面是答案,我进入了amazon php开发论坛,并从专业人士那里得到了帮助

看起来您可能在SDK的版本2和版本3之间切换,或者查看错误的文档。确保您得到了您想要使用的,并且正在查看正确的文档。他们是不同的

V3 -编写器要求:{“aws/aws sdk php”:“~3.0”} -用户指南: -API文档: -预签名URL文档:

V2 -编写器要求:{“aws/aws sdk php”:“~2.8”} -用户指南: -API文档: -预签名URL文档:

关于你必须做什么的小分步指南:

1.安装composer,最好使用sudo:

    sudo curl -sS https://getcomposer.org/installer | sudo php
2.转到您的项目文件夹并创建一个composer.json文件,使用您想要/需要的版本,您可以在此处找到版本:,每个版本的命令似乎都非常特定于版本,请小心,这是我的主要问题

{
    "require": {
        "aws/aws-sdk-php": "~3.0"
    }
}

3.然后转到终端中的项目文件夹,通过composer安装sdk,然后进行更新,如:(如果更改版本,则必须再次更新。)

4.然后一切都准备就绪,您可以按照适当的版本文档进行操作,在我的“aws/aws sdk php”版本中是“~3.0”,对于预签名的url,有效的是:

    require 'vendor/autoload.php';
    use Aws\S3\S3Client;
    use Aws\S3\Exception\S3Exception;

    $sharedConfig = [
        'region'  => 'us-west-1',
        'version' => 'latest'
    ]; //I have AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY as environment variables

    $s3Client = new Aws\S3\S3Client($sharedConfig);

    $cmd = $s3Client->getCommand('GetObject', [
        'Bucket' => $bucket,
        'Key'    => $keyname
    ]);

    $request = $s3Client->createPresignedRequest($cmd, '+20 minutes');
    $presignedUrl = (string) $request->getUri();
    echo $presignedUrl;

我希望这能帮助任何面临与我相同问题的人。

如果您使用的是Laravel,您可以轻松获得
S3
的临时URL,如下所述:

您的
图像
模型示例如下:

class Image extends Model
{

    ...

    public function getTemporaryUrlAttribute()
    {
        return Storage::disk('s3')->temporaryUrl(
            $this->path,
            now()->addSeconds(10)
        );
    }
}
<img width="100px" src="{{$image->temporaryUrl}}">
然后在HTML中,它将是:

class Image extends Model
{

    ...

    public function getTemporaryUrlAttribute()
    {
        return Storage::disk('s3')->temporaryUrl(
            $this->path,
            now()->addSeconds(10)
        );
    }
}
<img width="100px" src="{{$image->temporaryUrl}}">
temporaryUrl}}>

您将在签名过程中使用的aws密钥和密码传递到哪里?它们被设置为环境变量。这里是+20分钟。是否有最短时间限制?我正在尝试+3秒,过期时间超过10秒。文档没有说明限制,“URL应该过期的时间”。这可以是Unix时间戳、PHP DateTime对象,也可以是可由strtotime()计算的字符串。“太好了!步骤4提供了我想要的信息。你今晚为我节省了几个小时。”。