使用PHP SDK for Amazon S3的错误

时间:2015-01-17 16:22:19

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

编辑:问题解决了(感谢this post)!我只需要安装curl:

sudo apt-get install php5-curl

我正在开发一种工具,可以从浏览器上传AWS S3存储桶中的图像。我正在使用亚马逊提供的PHP SDK。 我尝试了documentation中提供的代码,但它不适用于我:

use Aws\S3\S3Client;

$bucket = '*** Your Bucket Name ***';
$keyname = '*** Your Object Key ***';
// $filepath should be absolute path to a file on disk                      
$filepath = '*** Your File Path ***';

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

// Upload a file.
$result = $s3->putObject(array(
    'Bucket'       => $bucket,
    'Key'          => $keyname,
    'SourceFile'   => $filepath,
    'ContentType'  => 'text/plain',
    'ACL'          => 'public-read',
    'StorageClass' => 'REDUCED_REDUNDANCY',
    'Metadata'     => array(    
        'param1' => 'value 1',
        'param2' => 'value 2'
    )
));

echo $result['ObjectURL'];

即使我只保留这两行:

use Aws\S3\S3Client;
$s3 = S3Client::factory();

......我收到了这些错误:

  

注意:使用未定义的常量CURLE_COULDNT_RESOLVE_HOST - 假设   'CURLE_COULDNT_RESOLVE_HOST'中   第244行的phar:///var/www/aws.phar/Aws/S3/S3Client.php

     

注意:使用未定义的常量CURLE_COULDNT_CONNECT - 假设   'CURLE_COULDNT_CONNECT'中   第244行的phar:///var/www/aws.phar/Aws/S3/S3Client.php

     

注意:使用未定义的常量CURLE_PARTIAL_FILE - 假设   phar:///var/www/aws.phar/Aws/S3/S3Client.php中的'CURLE_PARTIAL_FILE'   在第244行

     

注意:使用未定义的常量CURLE_WRITE_ERROR - 假设   phar:///var/www/aws.phar/Aws/S3/S3Client.php上的'CURLE_WRITE_ERROR'   第244行

     

注意:使用未定义的常量CURLE_READ_ERROR - 假设   phar:///var/www/aws.phar/Aws/S3/S3Client.php上的'CURLE_READ_ERROR'   第244行

     

注意:使用未定义的常量CURLE_OPERATION_TIMEOUTED - 假设   'CURLE_OPERATION_TIMEOUTED'中   第244行的phar:///var/www/aws.phar/Aws/S3/S3Client.php

     

注意:使用未定义的常量CURLE_SSL_CONNECT_ERROR - 假设   'CURLE_SSL_CONNECT_ERROR'中   第244行的phar:///var/www/aws.phar/Aws/S3/S3Client.php

     

注意:使用未定义的常量CURLE_HTTP_PORT_FAILED - 假设   'CURLE_HTTP_PORT_FAILED'中   第244行的phar:///var/www/aws.phar/Aws/S3/S3Client.php

     

注意:使用未定义的常量CURLE_GOT_NOTHING - 假设   phar:///var/www/aws.phar/Aws/S3/S3Client.php上的'CURLE_GOT_NOTHING'   第244行

     

注意:使用未定义的常量CURLE_SEND_ERROR - 假设   phar:///var/www/aws.phar/Aws/S3/S3Client.php上的'CURLE_SEND_ERROR'   第244行

     

注意:使用未定义的常量CURLE_RECV_ERROR - 假设   phar:///var/www/aws.phar/Aws/S3/S3Client.php上的'CURLE_RECV_ERROR'   第244行

     

致命错误:未捕获的异常   'Guzzle \ Common \ Exception \ RuntimeException',带有消息'The PHP cURL   必须安装扩展才能使用Guzzle。在   phar:///var/www/aws.phar/Guzzle/Http/Client.php:72堆栈跟踪:#0   PHAR:///var/www/aws.phar/Aws/Common/Client/AbstractClient.php(79):   狂饮\ HTTP \客户端 - > __构建体( 'https://s3.amaz ...',   对象(Guzzle \ Common \ Collection))#1   PHAR:///var/www/aws.phar/Aws/Common/Client/ClientBuilder.php(249):   AWS \共同\客户\ AbstractClient-> __构建体(对象(AWS \共同\凭证\ RefreshableInstanceProfileCredentials),   对象(Aws \ S3 \ S3Signature),对象(Guzzle \ Common \ Collection))#2   PHAR:///var/www/aws.phar/Aws/S3/S3Client.php(207):   Aws \ Common \ Client \ ClientBuilder-> build()#3 /var/www/response.php(30):   抛出Aws \ S3 \ S3Client :: factory()#4 {main}   第72行的phar:///var/www/aws.phar/Guzzle/Http/Client.php

1 个答案:

答案 0 :(得分:0)

刚刚在我的本地机器上安装了aws php sdk,没有任何aws注册, 经过几次尝试得到这个工作代码:

use Aws\S3\S3Client;

$bucket = '*** Your Bucket Name ***';
$keyname = '*** Your Object Key ***';
// $filepath should be absolute path to a file on disk                      
$filepath = '*** Your File Path ***';

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

// Upload a file.
$result = $s3->putObject(array(
    'Bucket'       => $bucket,
    'Key'          => $keyname,
    'SourceFile'   => $filepath,
    'ContentType'  => 'text/plain',
    'ACL'          => 'public-read',
    'StorageClass' => 'REDUCED_REDUNDANCY',
    'Metadata'     => array(    
        'param1' => 'value 1',
        'param2' => 'value 2'
    )
));
echo $result['ObjectURL'];

} catch (Exception $e) {
    echo $e->getMessage() . "\n";
}

此代码返回aws异常消息:

您必须为Body或SourceFile参数指定非空值。

如果我将$filepath更改为任何实际文件的路径,则此代码输出:

从实例配置文件元数据服务器检索凭据时出错。当您未在Amazon EC2内部运行时,您必须在"密钥"中提供您的AWS访问密钥ID和秘密访问密钥。和#34;秘密"创建客户端或提供实例化的Aws \ Common \ Credentials \ CredentialsInterface对象时的选项。 ([curl] 28:5000毫秒后连接超时[url] http://XXX.xxx.xxx.xxx/latest/meta-data/iam/security-credentials/

所以,如果有任何问题,非常受欢迎,但它必须有效。

顺便说一句,如果我从代码中删除catch部分,我会在破坏的页面上从php获取相同的错误消息。

希望这可以帮助你。