Чтение частного аутентифицированного образа из Amazon S3 с помощью Imagick PHP

Я новичок как в Amazon S3, так и в библиотеке Imagick PHP, но до сих пор мне удавалось делать то, что я хочу (например, загружать файлы и генерировать ряд эскизов). В настоящее время я не могу определить, может ли Imagick прочитать аутентифицированное изображение с S3. Я хотел бы иметь возможность сделать это, чтобы прочитать исходные изображения для редактирования.

Следующее работает, когда разрешения для моего файла установлены для получателя: Все (публичное чтение), но не иначе. (Я установил общую политику для своего сегмента, чтобы ограничить доступ только к определенным доменам, включая локальный хост, где я сейчас тестирую):

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

Приведенный выше код не выполняется. Есть ли какие-либо настройки в S3 или Imagick, которые позволяют читать изображение? Заранее спасибо за вашу помощь!


person Ian Spangler    schedule 25.04.2013    source источник
comment
Теперь я знаю, что одним из решений этой дилеммы является создание безопасного (подписанного) URL-адреса из Amazon с помощью s3->getAuthenticatedURL($bucket, $fileName, $lifetime, true, true); Я могу создать URL-адрес таким образом. Однако URL-адрес не является полностью правильным, поскольку URL-адрес возвращает ошибку XML ‹Code›SignatureDoesNotMatch‹/Code›‹Message›Подпись запроса, которую мы вычислили, не соответствует предоставленной вами подписи. Проверьте свой ключ и метод подписи.‹/Message›. Не уверен, в чем может быть проблема, так как я уже пробовал много разных вещей. У кого-нибудь есть идеи?   -  person Ian Spangler    schedule 26.04.2013


Ответы (2)


Мне удалось избежать сохранения изображения перед созданием объекта Imagick с помощью S3 Stream Wrapper:

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 такой же, как $s3 в ответе Джереми Линдблома - вам нужно сначала создать клиент S3, как показано там.

person Andrew Pirie    schedule 28.06.2016

Вероятно, вам следует загрузить изображение локально, прежде чем пытаться работать с ним в Imagick. Вы можете использовать SDK AWS для PHP, чтобы сделать это с помощью следующего кода:

$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, в руководство пользователя для S3.

person Jeremy Lindblom    schedule 29.04.2013
comment
Действительно ли необходимо сначала записать образ на диск? - person enpenax; 08.06.2015