You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非AWS服务器使用PHP SDK上传S3 Bucket遇凭证超时错误求助

问题分析与解决

核心问题:代码中Credentials配置项存在格式错误

你的代码里'credentials '键后面多了两个空格,AWS PHP SDK无法识别这个配置项,因此会 fallback 到默认的实例元数据服务去获取凭证——而这个服务(169.254.169.254)仅AWS云内实例可访问,你的非AWS主机自然会超时。

修复步骤

1. 修正Credentials配置的键名

把带多余空格的'credentials '改为正确的'credentials',修正后的客户端初始化代码:

$this->client = new S3Client([
    'region' => $this->params->get('aws')['region'],
    'version' => $this->params->get('aws')['version'],
    'credentials' => [ // 这里去掉多余空格
        'key'    => $this->params->get('aws')['credentials']['access_key'],
        'secret' => $this->params->get('aws')['credentials']['secret_key']
    ]
]);

2. 补充PutObject的Body参数

你的putObject调用缺少要上传的文件内容(Body参数),SDK无法知道要上传什么文件,必须补充:

  • 如果上传本地文件:
$result = $this->client->putObject([
    'Bucket' => $this->params->get('aws')['bucket_name'],
    'Key' => $path.'/'.$this->generateFileKey(),
    'ACL' => 'private',
    'Body' => fopen('/path/to/your/local/file', 'rb') // 本地文件路径
]);
  • 如果上传内存中的内容:
$result = $this->client->putObject([
    'Bucket' => $this->params->get('aws')['bucket_name'],
    'Key' => $path.'/'.$this->generateFileKey(),
    'ACL' => 'private',
    'Body' => '你要上传的文本内容'
]);

3. 验证IAM权限与Bucket配置

  • 确保你的IAM用户拥有s3:PutObject权限,可在IAM控制台给用户添加如下策略:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::你的Bucket名称/*"
        }
    ]
}
  • 无需修改Bucket的公开访问配置(你设置了ACL: private,保持默认即可),只要IAM权限正确就能上传。

内容的提问来源于stack exchange,提问作者Dula

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 18:03:20