PHP Amazon AWS S3 — загрузка объекта с использованием предварительно подписанного URL

#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 .