【问题标题】:Amazon s3 SDK for php can not get Bucket object listAmazon s3 SDK for php 无法获取 Bucket 对象列表
【发布时间】:2015-09-29 22:02:35
【问题描述】:

我正在从存储桶中获取对象列表,但它得到了端点错误。

define('AWS_KEY', 'xxxxxx');
define('AWS_SECRET_KEY', 'x+x/xxxxxxxx/');
define('AWS_CANONICAL_ID','xx');
define('AWS_CANONICAL_NAME', 'xxxxx');
$HOST = 's3.amazonaws.com';
require_once 'php_plugins/aws/v1/sdk.class.php';

$Connection = new AmazonS3(array(
 'key' => AWS_KEY,
 'secret' => AWS_SECRET_KEY,
 'canonical_id' => AWS_CANONICAL_ID,
 'canonical_name' => AWS_CANONICAL_NAME,
));

$ListResponse = $Connection->list_buckets();
$Buckets = $ListResponse->body->Buckets->Bucket;
foreach ($Buckets as $Bucket) {
    echo $Bucket->Name . "\t" . $Bucket->CreationDate . "\n";
    $response = $Connection->list_objects($Bucket->Name);
}

我正在收到回复。

[body] => CFSimpleXML Object
    (
        [Code] => PermanentRedirect
        [Message] => The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.
        [Bucket] => pics.online.com
        [Endpoint] => pics.online.com.s3.amazonaws.com
        [RequestId] => 5F102571A54DA3BA
        [HostId] => tBBxwxfUbdlV+m1R/Z9BnjLViyjROdzXrhPfc28WHaZYo/1zAwof2C0G5CVpZvkP8oZERTL0CD8=
    )

[status] => 301

我认为错误在 URL 代码调用“主机名/桶名” 在这里,我更改了我的存储桶名称 https://s3.amazonaws.com/pics.online.com/ 它应该调用 https://pics.online.com.s3.amazonaws.com/

谁能告诉我如何为 amazon s3 PHP 更改此路径?

【问题讨论】:

  • 您将 S3 存储桶放在哪里?如果不是美国标准,请不要忘记设置您的区域。
  • @EdwardSamuel 我已设置区域,但它显示 AWS 错误代码:PermanentRedirect,状态代码:301

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


【解决方案1】:

试试这个

<?php
require 'aws-autoloader.php';

$credentials = new Aws\Credentials\Credentials('XXXXXXXXXXXXX', 'XXXXXXXXXXXXXX');
$bucket = "";
$s3 = \Aws\S3\S3Client::factory([
    'signature' => 'v4',
    'version' => 'latest',
    'region' => 'ap-southeast-1',
    'credentials' => $credentials,
    'http' => [
        'verify' => '/home/ubuntu/cacert.pem'
    ],
    'Statement' => [
        'Action ' => "*",
    ],
//    'debug' => [
//        'logfn' => function ($msg) {
//            echo $msg . "\n";
//        },
//        'stream_size' => 0,
//        'scrub_auth' => true,
//        'http' => true,
//    ]
        ]);

try {
  $objects = $s3->getIterator('ListObjects', array(
      'Bucket' => $bucket //bucket name
  ));

 echo "Keys retrieved!\n";
 foreach ($objects as $object) {
     echo $object['Key'] . "\n";
 }
} catch (S3Exception $e) {
  echo $e->getMessage() . "\n";
 }
?>

AWS PHP SDK下载sdk

更新

首先使用以下文件检查您系统的 AWS 兼容性。

https://github.com/amazonwebservices/aws-sdk-for-php/tree/master/_compatibility_test

您可以使用 cacert.pem 从 AWS S3 获取全部数据。

您可以从 here 下载 cacert.pem。并通过添加以下代码修改您的php.ini

curl.cainfo = D:\xampp\php\cacert.pem

这是我在本地机器上使用的代码,用于在不使用 https 的情况下获取数据。我有 PHP V5.6 。

require 'aws-autoloader.php';
$s3 = \Aws\S3\S3Client::factory(array(
            'credentials' => array(
                'key' => '************',
                'secret' => '*************',
            ),
              'signature' => 'v4',
            'version' => 'latest',
            'region' => 'ap-southeast-1',
        ));
   print_r($result = $s3->listBuckets());

如果您遇到以下格式的错误。您可以使用数组格式来初始化 S3 对象。

【讨论】:

  • 我提供的代码只有 38 行。你能告诉我是什么导致的错误吗?哪个变量或条件?
  • 解析错误:语法错误,第 6 行 /home/public_html/i.php 中出现意外的 '[',期待 ')'
  • 您在使用 AWS 开发工具包吗?如果是,那是哪个版本?
  • 您是使用我提供的相同代码还是使用您自己的代码?
  • 这里是和我的代码一样工作的文档。docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/…
【解决方案2】:

您可以使用 set_hostname 方法指定存储桶名称...

$Connection->set_hostname($HOST); // Set the hostname
$Connection->allow_hostname_override(false); // Stop the hostname being changed later.

您的代码应如下所示...

define('AWS_KEY', 'xxxxxx');
define('AWS_SECRET_KEY', 'x+x/xxxxxxxx/');
define('AWS_CANONICAL_ID','xx');
define('AWS_CANONICAL_NAME', 'xxxxx');
$HOST = 's3.amazonaws.com';
require_once 'php_plugins/aws/v1/sdk.class.php';

$Connection = new AmazonS3(array(
 'key' => AWS_KEY,
 'secret' => AWS_SECRET_KEY,
 'canonical_id' => AWS_CANONICAL_ID,
 'canonical_name' => AWS_CANONICAL_NAME,
)); 

$Connection->set_hostname('pics.online.com.s3.amazonaws.com');
$Connection->allow_hostname_override(false);

$ListResponse = $Connection->list_buckets();
$Buckets = $ListResponse->body->Buckets->Bucket;
foreach ($Buckets as $Bucket) {
    echo $Bucket->Name . "\t" . $Bucket->CreationDate . "\n";
    $response = $Connection->list_objects($Bucket->Name);
}

【讨论】:

  • 它显示致命错误:未捕获的异常 'cURL_Exception' 带有消息 'cURL 资源:资源 id #9; cURL 错误:(cURL 错误代码 51)。有关错误代码的说明,请参阅curl.haxx.se/libcurl/c/libcurl-errors.html。 php_plugins/aws/v1/lib/requestcore/requestcore.class.php:847
【解决方案3】:

我不确定您的存储桶位于哪个区域。我以为您在多个区域中有多个存储桶。您不能使用S3Client 为不同区域调用对象相关操作。它仅适用于特定区域。

<?php

define('AWS_KEY', 'AKIAXXXXXXXXXXXXXXXX');
define('AWS_SECRET_KEY', 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
define('REGION', 'ap-southeast-1');

require_once 'aws-sdk-php-3.4.0/aws-autoloader.php';

$client = new Aws\S3\S3Client(array(
    'credentials' => array(
        'key' => AWS_KEY,
        'secret' => AWS_SECRET_KEY,
    ),
    'region' => REGION,
    'version' => 'latest',
));

$listBuckets = $client->listBuckets();
foreach ($listBuckets['Buckets'] as $bucket) {
    // Get bucket location
    $location = $client->getBucketLocation(array(
        'Bucket' => $bucket['Name']
    ));

    // Print bucket information
    echo $bucket['Name'] . "\t" . $bucket['CreationDate'] . "\t" . $location['LocationConstraint'] . "\n";

    // Check if the bucket location is in client region
    if ($location['LocationConstraint'] == $client->getRegion()) {
        $listObjects = $client->listObjects(array(
            'Bucket' => $bucket['Name']
        ));

        foreach ($listObjects['Contents'] as $object) {
            echo $object['Key'] . "\t" . $object['Size'] . "\n";
        }
    } else {
        echo "--> The bucket is not in " . $client->getRegion() . ". Skipped.\n";
    }
}

如果您在多个区域工作,您可以为每个区域创建单独的S3Client

【讨论】:

  • 我的存储桶位于 ap-southeast-1 区域。
  • 嗨,你试过运行我的代码吗?从输出中检查您在ap-southeast-1 区域之外是否有一些存储桶。
  • 是的,您的代码正在运行。如何检查存储桶中是否存在文件?
猜你喜欢
  • 2018-09-24
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 2017-06-29
  • 1970-01-01
相关资源
最近更新 更多