【问题标题】:Amazon S3 SDK PHP doesObjectExist() problemsAmazon S3 开发工具包 PHP doesObjectExist() 问题
【发布时间】:2015-04-12 16:51:22
【问题描述】:

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

我在使用 Amazon AWS S3 PHP 开发工具包时遇到问题。我只是想检查一个文件是否存在。 使用这个 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"
      ]
    }
  ]
}

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

【问题讨论】:

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


    【解决方案1】:

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

    那么这个对象真的存在吗?检查事项:

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

    【讨论】:

    • 我添加了前导斜杠,因为没有它就无法工作,我将删除它并更新最重要的问题,并仔细检查这不是问题 - 我怀疑这可能是权限问题。
    • 对我来说问题是前导斜线,删除它就解决了!
    【解决方案2】:

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

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

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

    缺少或不正确的 SSE 选项将产生 falsedoesObjectExist 返回。

    【讨论】:

      【解决方案3】:

      我在另一个 SO 帖子中找到了答案,来自 Carlos Castillo 的评论:

      AWS PHP SDK Version 2 S3 filename encoding issue

      他将我指向Github 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、Carlos 和 Stack Overflow,因为它的 SEO 非常出色

      【讨论】:

      • 啊,桶的位置是有问题的。
      猜你喜欢
      • 1970-01-01
      • 2013-07-01
      • 1970-01-01
      • 2014-12-22
      • 1970-01-01
      • 1970-01-01
      • 2014-01-09
      • 2019-05-19
      • 1970-01-01
      相关资源
      最近更新 更多