По умолчанию запрос 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. Но всякий раз, когда я передаюмаркером запроса я получаю сообщение об ошибке «Подпись не соответствует».
Кто-нибудь знает, в чем проблема?