如果给出一个不存在的键

时间:2017-01-06 18:06:47

标签: php amazon-s3

如果我请求一个不存在的密钥,

AWS S3Client->getObject()永远不会返回并且永远不会抛出异常。我怀疑其他S3Client方法在给出一个不存在的密钥时会遇到同样的问题。

但是,如果我使用'debug' => true配置S3Client,则在找不到文件时会抛出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选项以使用调试输出调用空函数。然而,这似乎不是一个永久的解决方案。

还有其他人遇到过这个问题吗?有更好的解决方法吗?

2 个答案:

答案 0 :(得分: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"中唯一的区别是它不会NoSuchKeyException而是Aws\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/*"
        }
    ]
}

答案 1 :(得分:0)

在进行任何操作之前,您可以使用此功能检查密钥(文件名)是否存在。

  

$ doesFileExist = $ client-> doesObjectExist($ bucket,$ key);

这是对还是错