#php #amazon-web-services #amazon-s3
#php #amazon-веб-сервисы #amazon-s3
Вопрос:
Я пытаюсь сгенерировать URL-адрес, который другая система может использовать для загрузки файла в мою корзину S3. Однако я просмотрел документацию и аналогичные проблемы, но не могу найти правильное решение.
Я попытался создать предварительно подписанный URL-адрес несколькими способами ( $this->s3
это ссылка so S3Client):
1:
$signedUrl = $this->s3->getCommand(
'PutObject',
array(
'Bucket' => $this->bucket,
'Key' => 'recording_test.mp3',
'Body' => ''
)
)->createPresignedUrl(' 2 hours');
2:
$command = $this->s3->getCommand('PutObject', array('Bucket' => $this->bucket, 'Key' => 'recording_test3.mp3', 'Body' => ''));
$request = $command->prepare();
$signedUrl = $this->s3->createPresignedUrl($request, ' 2 hours');
При попытке просто получить доступ к URL-адресу я получаю следующую ошибку:
The request signature we calculated does not match the signature you provided. Check your key and signing method.
Я также пробовал это так:
$key = ‘recording_test2.mp3′;
$url = $this->bucket.’/’.$key;
$request = $this->s3->put($url);
$signedUrl = $this->s3->createPresignedUrl($request, ' 2 hours');
Однако при этом генерируется URL-адрес в формате s3.amazonaws.com/bucket/key...
, который выдает ошибку о недопустимой конечной точке, и эта конечная точка в формате bucket.s3.amazonaws.com/key...
должна использоваться. Изменение URL вручную приводит к той же ошибке недопустимой подписи, что и выше.
Я не могу понять, что я делаю неправильно или каким-либо другим способом сгенерировать предварительно подписанный URL-адрес?
Спасибо за помощь
Комментарии:
1. Кроме того, в сведениях об ошибке есть
StringToSign
поле, которое отличается в зависимости от того, открываю ли я просто URL-адрес или использую его в форме с загрузкой файла — не уверен, имеет ли это какое-либо отношение к чему-либо? Если да, то как я могу убедиться, что URL-адрес подходит для загрузки файла в корзину?2. не уверен, что у вас все еще есть такая же проблема, но вы должны получить доступ к ссылке с помощью запроса put, а не метода get или post
Ответ №1:
При создании подписанного URL-адреса не следует использовать Body
ключ. Созданный подписанный URL-адрес включает подпись загружаемого тела. Затем, когда вы пытаетесь загрузить файл с использованием URL-адреса, он не может сопоставить пустую строку, которую вы используете, с содержимым файла.
Кроме того, если вы используете Curl для размещения файла, я рекомендую использовать CURLFile и не забудьте использовать curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
для вашего запроса PUT .