【问题标题】:Errors using PHP SDK for Amazon S3使用适用于 Amazon S3 的 PHP 开发工具包时出错
【发布时间】:2015-01-17 16:22:18
【问题描述】:

编辑:问题已解决(感谢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' 在 phar:///var/www/aws.phar/Aws/S3/S3Client.php 在第 244 行

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

注意:使用未定义的常量 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' 在 phar:///var/www/aws.phar/Aws/S3/S3Client.php 在第 244 行

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

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

注意:使用未定义的常量 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 行

致命错误:未捕获的异常 带有消息“PHP cURL”的“Guzzle\Common\Exception\RuntimeException” 必须安装扩展才能使用 Guzzle。在 phar:///var/www/aws.phar/Guzzle/Http/Client.php:72 堆栈跟踪:#0 phar:///var/www/aws.phar/Aws/Common/Client/AbstractClient.php(79): Guzzle\Http\Client->__construct('https://s3.amaz...', 对象(Guzzle\Common\Collection))#1 phar:///var/www/aws.phar/Aws/Common/Client/ClientBuilder.php(249): Aws\Common\Client\AbstractClient->__construct(对象(Aws\Common\Credentials\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} 投入 phar:///var/www/aws.phar/Guzzle/Http/Client.php 在第 72 行

【问题讨论】:

  • attach a logger 调试电汇。
  • 我正在使用 nginx。我在开发过程中切换到 apache,现在出现错误。我编辑了我的消息。

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


【解决方案1】:

刚刚在我的本地机器上安装了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 内部运行时,您必须在创建客户端时在“key”和“secret”选项中提供您的 AWS 访问密钥 ID 和秘密访问密钥,或者提供实例化的 Aws\Common\Credentials\CredentialsInterface 对象。 ([curl] 28: 5000 毫秒后连接超时 [url] http://XXX.xxx.xxx.xxx/latest/meta-data/iam/security-credentials/)

因此,如果您有任何问题,我们非常欢迎,但它必须有效。

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

希望这对您的情况有所帮助。

【讨论】:

    猜你喜欢
    • 2019-05-15
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多