Я пытаюсь настроить процесс загрузки на довольно старом веб-сервере, так что, когда пользователь загружает в него новый файл, клиент сначала отправляет запрос (без файла) на веб-сервер, который выполняет некоторую обработку и возвращает предварительно подписанный URL-адрес, который позволит клиенту загрузить файл непосредственно на S3.Создание назначенного URL-адреса POST для загрузки файлов с помощью AWS SDK для PHP v2
Следует отметить, что я использую v2 для AWS SDK для PHP из-за версии PHP, установленной на сервере.
Я могу создать presigned URL, используя следующий код:
$s3Client = Aws\S3\S3Client::factory(array(
'key' => "xxxxxxxxxxxxxxxxxxxx",
'secret' => "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
));
$command = $s3Client->getCommand('PutObject', array(
'Bucket' => 'bucketname',
'Key' => $this->_id.'/model.xyz',
'Body' => '',
'ContentMD5' => false,
'ContentType' => 'multipart/form-data',
));
return $command->createPresignedUrl('+20 minutes');
Это успешно создает URL, который передается клиенту. Однако, при отправке последующего запроса на S3, я получаю эту ошибку:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
<AWSAccessKeyId>xxxxxxxxxxxxxxxxxxxxxxx</AWSAccessKeyId>
<StringToSign>POST
multipart/form-data; boundary=----WebKitFormBoundaryLFAYOUC0JsblZJHj
1464614702
/bucketname/blah/model.xyz</StringToSign>
<SignatureProvided>xxxxxxxxxxxxxxxxxxxxxxxxxxx</SignatureProvided>
<StringToSignBytes>xx xx xx xx xx xx xx xx xx xx xx...</StringToSignBytes>
<RequestId>XXXXXXXXXXXXXXXXXXXX</RequestId>
<HostId>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</HostId>
</Error>
Я только что создал доступ и секретные ключи, используемый (с пользователем более чем достаточно разрешений), так и неверные ключи не проблема ,
заголовки запроса:
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, br
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Content-Length:50145
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryLFAYOUC0JsblZJHj
Host:bucketname.s3.amazonaws.com
Origin:http://website.com
Pragma:no-cache
Referer:http://website.com/script.php
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
Длина содержания, указанные здесь различны, но это так важно? Учитывая, что URL-адрес создается до того, как файл загружен, я не уверен, как бы я получил эту информацию в любом случае.
Если кто-либо может видеть что-либо, что явно не соответствует вышеуказанному, что может привести к этой ошибке, любой совет будет с благодарностью оценен.
Спасибо за помощь. Я в настоящее время борется с тем, как фактически получить всю информацию, необходимую для запроса из SDK, - есть ли у вас какие-либо предложения здесь? –
Я не уверен, что этот конкретный SDK будет очень полезен. Я всегда писал весь свой код для подписи запроса, разработки политики и т. Д. Однако не человек PHP. –