Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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
使用Imagick PHP从Amazon S3读取经过身份验证的私有图像_Php_Amazon S3_Acl_Imagick - Fatal编程技术网

使用Imagick PHP从Amazon S3读取经过身份验证的私有图像

使用Imagick PHP从Amazon S3读取经过身份验证的私有图像,php,amazon-s3,acl,imagick,Php,Amazon S3,Acl,Imagick,我对AmazonS3和ImagickPHP库都相当陌生,但到目前为止,我已经能够用它实现我想要的功能(即:上传文件并生成一系列缩略图)。目前,我正忙于确定Imagick是否可以从S3读取经过身份验证的图像。我想能够做到这一点,以便阅读在原始图像编辑回来 当“我的文件”的权限设置为“被授予者”时,以下选项有效:Everyone(公共读取),但不适用于其他情况。(我已经为我的bucket设置了总体策略,只限制对某些域的访问,包括我现在正在测试的localhost): 上述代码无法执行。S3或Imag

我对AmazonS3和ImagickPHP库都相当陌生,但到目前为止,我已经能够用它实现我想要的功能(即:上传文件并生成一系列缩略图)。目前,我正忙于确定Imagick是否可以从S3读取经过身份验证的图像。我想能够做到这一点,以便阅读在原始图像编辑回来

当“我的文件”的权限设置为“被授予者”时,以下选项有效:Everyone(公共读取),但不适用于其他情况。(我已经为我的bucket设置了总体策略,只限制对某些域的访问,包括我现在正在测试的localhost):


上述代码无法执行。S3或Imagick中是否有任何可以读取图像的设置?提前感谢您的帮助

在Imagick中使用图像之前,您可能应该在本地下载图像。您可以使用以下代码来执行此操作:

$s3 = Aws\S3\S3Client::factory(array(
    'key'    => '<your-aws-access-key-id>',
    'secret' => '<your-aws-secret-key>'
));

$bucket = 'myBucket';
$key = 'folder/exampleFile-9203914980.43.jpg';
$tempImage = '/tmp/' . $bucket . '/' . $key;

$s3->getObject(array(
    'Bucket' => $bucket,
    'Key'    => $key,
    'SaveAs' => $tempImage
));

$image = new Imagick($tempImage);

// do stuff
// ...

unlink($tempImage);
$s3=Aws\s3\S3Client::工厂(数组)(
'键'=>'',
“秘密”=>“
));
$bucket='myBucket';
$key='folder/exampleFile-9203914980.43.jpg';
$tempImage='/tmp/'$桶“/”$钥匙
$s3->getObject(数组)(
“Bucket”=>$Bucket,
“Key”=>$Key,
“另存为”=>$tempImage
));
$image=new Imagick($tempImage);
//做事
// ...
取消链接($tempImage);

您可以了解有关如何在SDK上使用S3客户端的更多信息。

我通过使用S3流包装器在创建Imagick对象之前避免了保存映像:


$client与Jeremy Lindblom回答中的$s3相同-您需要首先创建一个s3客户端,如图所示。

我现在知道,解决这个难题的一个方法是使用s3->GetAuthenticateURL($bucket,$fileName,$lifetime,true,true)从Amazon生成一个安全(签名)URL;我能够以这种方式生成URL。但是,URL不完全正确,因为URL返回XML错误“signaturedesnotmatch我们计算的请求签名与您提供的签名不匹配。请检查您的密钥和签名方法。”。我不确定问题出在哪里,因为我已经尝试了很多不同的方法。有人有什么想法吗?真的有必要先将映像写入磁盘吗?
$s3 = Aws\S3\S3Client::factory(array(
    'key'    => '<your-aws-access-key-id>',
    'secret' => '<your-aws-secret-key>'
));

$bucket = 'myBucket';
$key = 'folder/exampleFile-9203914980.43.jpg';
$tempImage = '/tmp/' . $bucket . '/' . $key;

$s3->getObject(array(
    'Bucket' => $bucket,
    'Key'    => $key,
    'SaveAs' => $tempImage
));

$image = new Imagick($tempImage);

// do stuff
// ...

unlink($tempImage);
$client->registerStreamWrapper();
$data = file_get_contents('s3://bucket/key');
$im = new Imagick();
$im->readImageBlob($data);