如何通过PHP访问AWS S3?

时间:2016-09-09 22:01:04

标签: php amazon-s3

我使用Composer按the getting started instructions found here安装适用于PHP的AWS开发工具包。我在我的html root中安装了它。我创建了一个名为" ImageUser"的IAM用户。获得#3; AmazonS3FullAccess"的唯一许可;并抓住了它的钥匙。

Per the instructions here,我创建了一个名为"凭据"的文件。如下:

[default]
aws_access_key_id = YOUR_AWS_ACCESS_KEY_ID
aws_secret_access_key = YOUR_AWS_SECRET_ACCESS_KEY

是的,我用适当的键替换了那些大写单词。该文件位于隐藏的子目录" .aws"在html根目录中。该文件的UNIX权限为664。

我创建了这个简单的文件(名为" test.php"在我的html根的子目录中,名为" t")来测试将文件上传到S3:

<?php
// Include the AWS SDK using the Composer autoloader.
require '../vendor/autoload.php';

use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;
$bucket = 'testbucket';
$keyname = 'test.txt';

// Instantiate the client.
$s3 = S3Client::factory();

try {
    // Upload data.
    $result = $s3->putObject(array(
        'Bucket' => $bucket,
        'Key'    => $keyname,
        'Body'   => 'Hello, world!',
        'ACL'    => 'public-read'
    ));

    // Print the URL to the object.
    echo $result['ObjectURL'] . "\n";
} catch (S3Exception $e) {
    echo $e->getMessage() . "\n";
}
?>

不幸的是,它会在以下行引发http错误500:

$s3 = S3Client::factory();

是的,自动加载器目录是正确的。是的,存在桶。不,文件&#34; test.txt&#34;尚不存在。

根据上面提到的页面,&#34;如果未向SDK明确提供凭据或配置文件,并且未在环境变量中定义凭据,但定义了凭证文件,则SDK将使用&#39;默认情况下&#39;简介&#34。即便如此,我也尝试明确指定配置文件&#34;默认&#34;在工厂声明中只是为了得到相同的结果。

我做错了什么?

1 个答案:

答案 0 :(得分:4)

<强> tldr;您有各种AWS SDK版本

  • 根据您在邮件中提供的链接(link),您已经安装了php sdk v3
  • 根据您的示例,您使用PHP sdk v2

v3不知道S3Client::factory方法,因此它会引发错误。您可以继续查看链接以检查使用情况https://docs.aws.amazon.com/aws-sdk-php/v3/guide/getting-started/basic-usage.html。有几种方法可以获得s3客户端

  1. 创建一个客户端 - 简单方法

    <?php
    // Include the SDK using the Composer autoloader
    require 'vendor/autoload.php';
    
    $s3 = new Aws\S3\S3Client([
        'version' => 'latest',
        'region'  => 'us-east-1'
    ]);
    
  2. 创建一个客户端 - 使用sdk类

    // Use the us-west-2 region and latest version of each client.
    $sharedConfig = [
        'region'  => 'us-west-2',
        'version' => 'latest'
    ];
    
    // Create an SDK class used to share configuration across clients.
    $sdk = new Aws\Sdk($sharedConfig);
    
    // Create an Amazon S3 client using the shared configuration data.
    $s3 = $sdk->createS3();
    
  3. 一旦你拥有了你的客户端,你就可以使用你现有的代码(是的,这个是v3)在s3上放置一个新对象,这样你就可以获得类似

    的内容
    <?php
    // Include the AWS SDK using the Composer autoloader.
    require '../vendor/autoload.php';
    
    use Aws\S3\S3Client;
    use Aws\S3\Exception\S3Exception;
    $bucket = 'testbucket';
    $keyname = 'test.txt';
    
    // Instantiate the client.
    
    -- select method 1 or 2 --
    
    try {
        // Upload data.
        $result = $s3->putObject(array(
            'Bucket' => $bucket,
            'Key'    => $keyname,
            'Body'   => 'Hello, world!',
            'ACL'    => 'public-read'
        ));
    
        // Print the URL to the object.
        echo $result['ObjectURL'] . "\n";
    } catch (S3Exception $e) {
        echo $e->getMessage() . "\n";
    }