2014-04-02 2 views
7

이 질문은 내가 업데이트 한 이후로 명확하게하기 위해 다시 작성했습니다.Amazon S3 SDK PHP doesObjectExist() 문제

Amazon AWS S3 PHP SDK에 문제가 있습니다. 파일이 있는지 그냥 확인하려고합니다. 이 PHP 스크립트 사용 :이 출력

<?php 
    require_once("../../../configs/config.".get_current_user().".php"); 
    require INCLUDES_PATH . 'libraries/aws/aws-autoloader.php'; 

    use Aws\S3\S3Client; 

    $client = S3Client::factory(array(
      'key' => AWS_ACCESS_KEY_ID, 
      'secret' => AWS_SECRET_KEY 
    )); 

    $key = 'profile/avatar/80745d03-c295-4205-bd82-58161f2fd2d1-320.jpg'; 
    $result = $client->doesObjectExist(AWS_S3_BUCKET, $key); 

    var_dump(AWS_S3_BUCKET); 
    var_dump($key); 
    var_dump($result); 

?> 

은 :

string(19) "stage.socialite.app" 
string(59) "profile/avatar/80745d03-c295-4205-bd82-58161f2fd2d1-320.jpg" 
bool(false) 

나는 파일이 존재 알고는 여기 :

http://stage.socialite.app.s3.amazonaws.com/profile/avatar/80745d03-c295-4205-bd82-58161f2fd2d1-320.jpg

이가에 대한 IAM 정책 키 ID 및 비밀번호를 사용중인 사용자 :

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Action": [ 
      "s3:*" 
     ], 
     "Resource": [ 
     "arn:aws:s3:::stage.socialite.app/*", 
     "arn:aws:s3:::stage.socialite.app" 
     ] 
    } 
    ] 
} 

방금 ​​새로운 키/암호 쌍을 만들어 내 구성에 추가했습니다. 내가 잘못 했습니까?

답변

2

나는 Carlos Castillo에서 코멘트에, 또 다른의 대답은 SO 게시 발견

AWS PHP SDK Version 2 S3 filename encoding issue

는 그는 S3 클라이언트를 초기화 할 때 지역을 설정 제안 Github Issue의 방향으로 날을 지적, 이것은 내 dev 서버가 아니라 미국의 기본 서버가 아닌 아일랜드의 S3 인스턴스를 사용하기 때문입니다.

그래서이 솔루션입니다 : AWS_S3_REGION는 키 및 비밀처럼 내 config 파일에서 상수 집합입니다

$client = S3Client::factory(array(
    'key' => AWS_ACCESS_KEY_ID, 
    'secret' => AWS_SECRET_KEY, 
    'region' => AWS_S3_REGION 
)); 

. 당신이 doesObjectExist와 SSE 옵션을 제공해야

서버 측 암호화를 사용하는 경우 :

신용이 neilscastle로 이동, 그것을 위해 카를로스와 스택 오버플로는 버킷 위치를 수정하고 권한을 읽을 또한 우수한 SEO

+2

아, 문제가되는 버킷 위치가 의미가 있습니다. –

5

var_dump()bool(false) 또는 bool(true)이라고하면 부울 값을 올바르게 반환합니다. print_r()에는 자세한 유형 정보가 포함되지 않으며 falsenull 값에 대해 빈 문자열을 반환합니다.

개체가 실제로 존재합니까? 확인 사항 :

  • S3 키 앞에 슬래시가 없습니다. 위의 코드와 출력에 따르면 이것이 문제라고 생각합니다.
  • CloudFront 배포 이름이 아닌 실제 S3 버킷 이름을 제공하고 있는지 확인하십시오.
  • doesObjectExist()은 해당 개체에 대한 읽기 권한이없는 경우 false를 반환합니다.
+1

없이 작동하지 않았으므로 앞의 슬래시를 추가했습니다. 제거한 후 맨 위 질문을 업데이트하고 문제가 아닌지 다시 확인합니다. 사용 권한 문제 일 수 있습니다. –

+1

나를 위해 문제는 그것을 해결하는 선도적 인 슬래시였다! – mathielo

2

입니다 .

$s3Client->doesObjectExist($bucket, $key, array(
    'SSECustomerAlgorithm' => 'AES256', 
    'SSECustomerKey'  => $encryptionKey, 
    'SSECustomerKeyMD5' => md5($encryptionKey, true) 
)); 

누락 또는 잘못된 SSE 옵션 doesObjectExist에서 false 수익을 얻을 것입니다.