2016-06-14 4 views
0

Я пытаюсь загрузить изображение на S3 с помощью Angular и Laravel 5.1.ОПЦИИ ERR_NAME_NOT_RESOLVED при загрузке файла на s3

Угловой сначала запрашивает мое приложение-сервер для назначенного URL-адреса, затем переходит к загрузке файла с использованием подписанного запроса.

Я получаю следующее сообщение об ошибке OPTIONS, когда подпись возвращается, а затем пытается загрузить с него:

OPTIONS https://s3.us-standard.amazonaws.com/my.resources/dog-aromatherapy.jpg?x-a…Signature=b3ef83... net::ERR_NAME_NOT_RESOLVED

My.Resources S3 Bucket CORS:

<?xml version="1.0" encoding="UTF-8"?> 
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
    <CORSRule> 
     <AllowedOrigin>*</AllowedOrigin> 
     <AllowedMethod>GET</AllowedMethod> 
     <AllowedMethod>POST</AllowedMethod> 
     <AllowedMethod>PUT</AllowedMethod> 
     <AllowedHeader>*</AllowedHeader> 
    </CORSRule> 
</CORSConfiguration> 

Laravel:

public function signature(Request $request) 
{ 

    ...get Request filename and filetype... 

    $s3Client = new S3Client([ 
     'region' => 'us-standard', 
     'version' => 'latest' 
    ]); 

    $options = [ 
     'Bucket'  => getenv('AWS_S3_BUCKET'), 
     'Key'  => $file_name, 
     'Expires' => 60, 
     'ContentType' => $file_type, 
     'ACL' => 'public-read' 
    ]; 

    $cmd = $s3Client->getCommand('PutObject', $options); 

    $s_request = $s3Client->createPresignedRequest($cmd, '+20 minutes'); 

    $pre_signedUrl = (string) $s_request->getUri(); 

    return response()->json(
     [ 
      'signed_request' => $pre_signedUrl, 
      'url' => 'https://s3.amazonaws.com/' . getenv('AWS_S3_BUCKET') . '/' . $file_name 
     ] 
    ); 
} 

Wh у дает? У меня есть действующий CORS конфигурации на правильное ведро S3, и я получаю, казалось бы, presigned подпись затем разрешить загрузку файлов ...


Нажатие на ошибку OPTIONS, заголовки следующим образом:

x-amz-acl:public-read 
X-Amz-Content-Sha256:UNSIGNED-PAYLOAD 
X-Amz-Algorithm:AWS4-HMAC-SHA256 
X-Amz-Credential:AKIA/20160614/us-standard/s3/aws4_request 
X-Amz-Date:20160614T172559Z 
X-Amz-SignedHeaders:host 
X-Amz-Expires:1200 
X-Amz-Signature:b3ef836... 
+0

Но ваши 'CORS' заголовки не позволяют' OPTIONS', который является провал? Я вижу только «GET/PUT/POST», но ему также нужны «ОПЦИИ» – Ohgodwhy

+0

Добавление ' OPTIONS' в s3 CORS дает ошибку 'Найденный неподдерживаемый HTTP-метод в конфигурации CORS. Неподдерживаемый метод - OPTIONS' – Growler

+0

. На самом деле существует другой способ сделать это на S3. Я не поклонник S3, но я знаю, что когда вы создаете ведро, у вас есть возможность выбирать 'HEAD + OPTIONS', а не только' HEAD'. Я не знаю, как изменить его после того, как вы создали ведро, извините. – Ohgodwhy

ответ

2

ошибка в этой строке заголовка

X-Amz-Credential:AKIA/20160614/us-standard/s3/aws4_request 

Изменить что "us-standard" к "us-east-1" и он будет работать

Amazon S3 переименовал регион США в США на восток (N. Вирджиния), чтобы соответствовать региональным соглашениям об именах AWS.

В этом коде

$cmd = $s3Client->getCommand('PutObject', $options); 

Варианты изменения в «Титулы»

+0

Теперь он загружает файл, но файл на 's3' равен 0 байтам. Это поддельная загрузка? – Growler

+0

Ну, это другая проблема в коде, случайно, что ваш файл загружается дважды? Проблема аутентификации была исправлена ​​по мере того, как учетные данные теперь работают, и происходит проверка подлинности. –

+0

В этом коде $ cmd = $ s3Client-> getCommand ('PutObject', $ options); изменить параметры на «params» и посмотреть, работает ли это? –

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