2014-04-02 203 views
7

我已经重写了这个问题,使其更清晰,因为我已经更新它。亚马逊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

我发现了另一个答案SO后,在评论来自Carlos Castillo

AWS PHP SDK Version 2 S3 filename encoding issue

他指出我在一个Github Issue,暗示初始化S3客户端时设置区域的方向,这是因为我在爱尔兰为我的开发服务器使用了一个S3实例,而不是默认的美国服务器。

所以这是解决方案:

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

AWS_S3_REGION是我的配置文件中的常数集,像钥匙和密码。

幸得neilscastle,卡洛斯和堆栈溢出为它的优秀的搜索引擎优化

+2

啊,水桶位置是问题是有道理的。 –

5

如果var_dump()bool(false)bool(true),那么它正确地返回一个布尔值。 print_r()不包含详细的类型信息,并返回falsenull值的空字符串。

那么对象是否真的存在?要检查的事项:

  • S3键没有引导斜线。根据你的代码和上面的输出,我怀疑这是问题所在。
  • 确保您提供的是实际的S3存储桶名称,而不是CloudFront分配名称。
  • doesObjectExist()如果用户没有该对象的读取权限,则返回false。
+1

我添加了前导斜杠,因为它不工作没有,我会删除它并更新最重要的问题,并仔细检查这不是问题 - 我怀疑它可能是权限问题。 –

+1

对我来说,问题是主导斜线,删除它解决了它! – mathielo

2

除了正确段位置和读权限:

如果使用服务器端加密,你需要提供SSE选项与doesObjectExist

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

缺少或不正确的SSE选项将产生从doesObjectExistfalse回报。