Amazon S3 SDK PHP doesObjectExist()问题

时间:2014-04-02 08:27:12

标签: php amazon-web-services amazon-s3

我已经重新编写了这个问题,以便更清楚,因为我已经更新了它。

我遇到了亚马逊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"
      ]
    }
  ]
}

我刚创建了一个新的Key / Secret对并将它们添加到我的配置中 - 我做错了什么?

3 个答案:

答案 0 :(得分:6)

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

对象实际存在吗?要检查的事项:

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

答案 1 :(得分:3)

除了正确的存储桶位置和读取权限外:

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

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

缺少或不正确的SSE选项将从false返回doesObjectExist

答案 2 :(得分:2)

我在Carlos Castillo的评论中找到了另一篇SO帖子的答案:

AWS PHP SDK Version 2 S3 filename encoding issue

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

所以这就是解决方案:

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

AWS_S3_REGION是我的配置文件中设置的常量,例如Key和Secret。

归功于neilscastle,Carlos和Stack Overflow因其出色的搜索引擎优化