2016-06-14 98 views
0

我試圖使用Angular和Laravel 5.1將圖像上傳到S3。將文件上傳到s3時的選項ERR_NAME_NOT_RESOLVED

Angular首先向我的服務器應用程序詢問預先設置的URL,然後繼續使用簽名的請求上傳文件。

,我發現了以下選項錯誤時簽名的回報,然後嘗試用它上傳:

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

my.resources S3鬥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在給?我對正確的S3存儲有效CORS配置,並且我得到一個看似presigned簽名,然後允許文件上傳...


點擊進入選項錯誤,標題如下:

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'這是失敗的? – Ohgodwhy

+0

將' OPTIONS'添加到s3 CORS在CORS配置中發現錯誤'發現不支持的HTTP方法。不支持的方法是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",它會工作

亞馬遜S3將美國標準地區重新命名爲美國東部地區(N.弗吉尼亞州)區域與AWS地區命名約定一致。

在這段代碼

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

的變化選項 「PARAMS」

+0

現在它正在上傳文件,但's3'上的文件是0字節。它假冒上傳? – Growler

+0

那麼這是代碼中的一個不同的問題,任何一個機會是你的文件上傳兩次?驗證問題已被修復,因爲證書現在正在工作並且正在進行驗證 –

+0

在此代碼中$ cmd = $ s3Client-> getCommand('PutObject',$ options);將選項更改爲「params」並查看它是否有效? –