2015-09-10 59 views
0

我嘗試獲得預標識的URL使用AWS的Amazon S3的對象\ S3 \ S3Client :: createPresignedRequest()方法:亞馬遜S3預簽名URL(AWS第3版)

$s3 = new S3Client($config); 

$command = $s3->getCommand('GetObject', array(
     'Bucket'      => $bucket, 
     'Key'      => $key, 
'ResponseContentDisposition'=>'attachment; filename="' . $fileName . '"', 
      )); 

$request = $s3->createPresignedRequest($command, $time); 

      // Get the actual presigned-url 
$this->signedUrl = (string)$request->getUri(); 

我得到這樣的預先登記的URL:

https://s3.amazonaws.com/img/1c9a149e-57bc-11e5-9347-58743fdfa18a?X-Amz-Content-Sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=13JZVPMFV04D8A3AQPG2%2F20150910%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20150910T181455Z&X-Amz-SignedHeaders=Host&X-Amz-Expires=1200&X-Amz-Signature=0d99ae98ea13e2974322575f95f5a19e94e13dc859b2509cecc21cd41c01c65d 

and this url returned error: 

<Error> 
<Code>NoSuchKey</Code> 
<Message>The specified key does not exist.</Message> 
.... 
+1

該文件不存在。在創建簽名URL時,不存在對象是否存在的驗證。此外,此存儲區未安全配置,您的對象列表是公開可見的。您應該從您的存儲桶策略中刪除s3:ListObjects權限。 –

+0

我不明白爲什麼它不適用於aws版本3,它適用於同一個對象,當我使用aws版本2時: $ s3 = S3Client :: factory($ config); $ command = $ s3-> getCommand('GetObject',array( 'Bucket'=> $ originalBucket, 'Key'=> $ key, 'ResponseContentDisposition'=>'attachment; filename =''。$ FileN '''' )); $ this-> signedUrl = $ command-> createPresignedUrl($ time); –

+0

您是否閱讀了我之前的評論?如果您的存儲桶被稱爲「img」,那麼該文件不在您的存儲桶中。如果你的存儲桶被稱爲別的東西,那麼請嘗試解釋爲什麼存儲桶名稱不會出現在URL中。 –

回答

1

生成預簽名URL完全在客戶端完成,不與S3服務API進行交互。因此,在創建預先簽名的URL時,不存在驗證對象實際存在。 (在上傳對象之前,技術上甚至可以創建預先簽名的URL)。

NoSuchKey錯誤意味着正是 - 不存在這樣的對象,具有在桶指定鍵,其中鍵,在S3中的說法,指的是對象的路徑+文件名(在URI)。 (它被稱爲密鑰,如在術語密鑰/值存儲中 - 其中S3是 - 對象的路徑是「密鑰」,並且對象體/有效載荷是「值」。)

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingObjects.html