2016-05-30 2 views
1

Я пытаюсь настроить процесс загрузки на довольно старом веб-сервере, так что, когда пользователь загружает в него новый файл, клиент сначала отправляет запрос (без файла) на веб-сервер, который выполняет некоторую обработку и возвращает предварительно подписанный 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-адрес создается до того, как файл загружен, я не уверен, как бы я получил эту информацию в любом случае.

Если кто-либо может видеть что-либо, что явно не соответствует вышеуказанному, что может привести к этой ошибке, любой совет будет с благодарностью оценен.

ответ

0

URL-адрес POST вы не можете использовать.

Вы используете подписанный документ политики (кодированный в формате base64 JSON, описывающий допустимые атрибуты загрузки), подпись и некоторые другие атрибуты, такие как тип содержимого фактического файла, все встроенные в форму.

Для Подписи Версия 2, построение политики, подписи и формы описаны в http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingHTTPPOST.html.

Для подписи Версия 4, эта же информация находится на http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-authentication-HTTPPOST.html.

Обратите внимание, что «версия подписи» не относится к версии SDK. Все регионы поддерживают Sig V4. Регионы, запущенные до 2014 года, также поддерживают Sig V2, который несколько проще реализовать с нуля.

Я упоминаю об этом, потому что я вообще этого не вижу в документах для PHP V2 SDK.

+0

Спасибо за помощь. Я в настоящее время борется с тем, как фактически получить всю информацию, необходимую для запроса из SDK, - есть ли у вас какие-либо предложения здесь? –

+0

Я не уверен, что этот конкретный SDK будет очень полезен. Я всегда писал весь свой код для подписи запроса, разработки политики и т. Д. Однако не человек PHP. –

Смежные вопросы