创建amazon aws s3预签名url PHP
根据这个链接,我可以轻松地创建一个预先签名的链接,只需将生命周期添加到getObjectUrl创建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,
$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提供了我想要的信息。你今晚为我节省了几个小时。”。