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


Reading a private authenticated image from Amazon S3 with Imagick PHP

我对Amazon S3和Imagick PHP库都相当陌生,但到目前为止已经能够完成我想要的(即:上传文件和生成一系列缩略图图像)。目前,我正在确定Imagick是否有可能从S3读取经过身份验证的映像。我希望能够做到这一点,以便在原始图像中进行编辑。

当我的文件的权限被设置为grant时:Everyone (public read), but not else。(我已经为我的桶设置了总体策略,以限制仅对某些域的访问,包括我现在正在测试的localhost):

$sourcePath = "https://s3.amazonaws.com/myBucket/folder/exampleFile-9203914980.43.jpg";
$image = new Imagick($sourcePath);

上面的代码执行失败。S3或Imagick中是否有允许读取图像的设置?提前感谢您的帮助!

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

https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/s3-stream-wrapper.html

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

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

在尝试在Imagick中使用它之前,您可能应该在本地下载该图像。您可以使用PHP的AWS SDK来执行此操作,代码如下:

$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的SDK用户指南中了解有关如何使用S3客户端的更多信息。