Запрос списка объектов S3 на ведро для получения дополнительных ключей (> 1000) - PullRequest
4 голосов
/ 21 марта 2011

По умолчанию запрос S3 List Objects (Get Bucket) возвращает 1000 ключей.Согласно документации S3, если я хочу перечислить больше объектов, тогда я должен передать строку запроса маркера вместе со своим запросом со значением маркера, установленным как последний ключ из предыдущего списка объектов.

По какой-то причине это не работает для меня ... Кажется, мне не хватает чего-то очевидного, и я пытаюсь выяснить, что.

Вот как должен выглядеть REST-запрос:

GET ?marker=LAST-KEY HTTP/1.1
Host: quotes.s3.amazonaws.com
Date: Wed, 01 Mar  2009 12:00:00 GMT
Authorization: AWS ACCESS_KEY_ID:SIGNATURE

Мой PHP-код выглядит примерно так:

...
// this is where I'm getting the value of the last key
$marker=$arrObjects["Contents"][999]["Key"];
...
//this is where I'm signing my request
$canonicalizedResources = "/".$bucketName."/".(($marker=="")?"":"?marker=".rawurlencode($marker));
// $contentMD5 and $contentType are both empty strings ""
$stringToSign = utf8_encode("GET"."\n".$contentMD5."\n".$contentType."\n".$timestamp."\n".$canonicalizedAmzHeaders.$canonicalizedResources);
$signature = base64_encode(hash_hmac("sha1",$stringToSign,$customerSecretKey,true));
...

Этот код отлично работает, если я перечисляю объекты в корзине, число которых меньше 1000. Но всякий раз, когда я передаюмаркером запроса я получаю сообщение об ошибке «Подпись не соответствует».

Кто-нибудь знает, в чем проблема?

1 Ответ

0 голосов
/ 22 марта 2011

Чтобы прокомментировать комментарий @ Skyler, используя SDK, ваш код может выглядеть следующим образом (за исключением битов авторизации):

// Instantiate the class
$s3 = new AmazonS3();

$response = $s3->list_objects('my-bucket');

Больше в документах AWS .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...