2017-01-06 47 views
2

AWS S3Client->getObject()永遠不會返回並且如果我請求不存在的鍵時從不拋出異常。我懷疑當給定一個不存在的密鑰時,其他S3Client方法也有同樣的問題。S3Client-> GetObject()如果給定一個不存在的鍵,則永遠不會返回或拋出異常

但是,如果我將S3Client配置爲'debug' => true,則當文件未找到時它將拋出Aws\S3\Exception\S3Exception,這是可以接受的。

下面是測試情況下,我寫道:

protected function _test_s3_client_get($unit, $key) { 
    $provider = CredentialProvider::ini(NULL, APPPATH . 'config/aws.ini'); 
    $provider = CredentialProvider::memoize($provider); 
    $client = new S3Client([ 
     'region' => 'us-east-1', 
     'version' => '2006-03-01', 
     'credentials' => $provider, 
     // 'debug' => ['logfn' => [$this, '_noop']] 
     // 'debug' => true, 
    ]); 
    try { 
     $result = $client->getObject(array(
      'Bucket' => 'mybucket', 
      'Key'=> $key, 
      )); 
    } catch (S3Exception $e) { 
     error_log($e); 
    } 
    $unit->run(isset($result['Body']), true, "Got $key"); 
} 

如果'debug' => true,該S3Client轉儲在響應龐大的數據量,無論它是否找到該文件。作爲一種解決方法,我可以設置debug選項來調用帶有調試輸出的空函數。儘管如此,這看起來並不是永久的解決方案。

有其他人遇到過這個問題嗎?有更好的解決方法嗎?

+0

如果沒有結果,我認爲'$ result'爲'null'是不是這種情況? – Pitchinnate

+0

@Pitchinnate它永遠不會返回。 –

+0

嗯,看看文檔沒有'getObject()'方法的返回錯誤。對於'GetObjectAcl()'有一個'NoSuchKey'錯誤,所以也許你可以先調用它來確保該鍵存在,然後調用'getObject()' – Pitchinnate

回答

0

我們使用"aws/aws-sdk-php": "2.8.22",在這種情況下我們有例外NoSuchKeyException。在這裏我們的代碼:

private function fileExists($bucket, $key) 
{ 
    try { 
     $o = $this->s3->getObject([ 
      'Bucket' => $bucket, 
      'Key' => $key, 
     ]); 
     return $o; 
    } catch (\Aws\S3\Exception\NoSuchKeyException $e) { 
     return false; 
    } 
} 

"aws/aws-sdk-php" "3.20.13"唯一的一個區別是,它拋出不NoSuchKeyExceptionAws\S3\Exception\S3Exception

順便說一句,檢查你的桶政策。我的政策:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "ACZ", 
      "Effect": "Allow", 
      "Principal": "*", 
      "Action": [ 
       "s3:PutObject", 
       "s3:GetObject", 
       "s3:DeleteObject" 
      ], 
      "Resource": "arn:aws:s3:::my.own.bucket/*" 
     } 
    ] 
} 
+0

此外它適用於版本爲''aws/aws-sdk-php「」3.20.13「'並且拋出異常'\ Aws \ S3 \ Exception \ S3Exception'。 –

+0

謝謝@VladimirKovpak。我明天開始工作時會查看桶策略。我沒有設置S3,也沒有直接的AWS賬戶。我依賴於一位同事。 –

相關問題