我正在使用AWS SDK PHP 3.67.5版本将文件上传到S3。该代码在Heroku测功机中。
我已经创建了访问密钥AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,并将它们设置为Heroku实例中的配置变量。我知道它们在那里,因为我已经使用getenv()将它们输出了。
我正在使用以下代码:
map
仍然上传文件,它显示以下错误:
try {
//Create a S3Client
$s3Client = new S3Client([
'profile' => 'default',
'region' => 'some-region',
'version' => 'latest'
]);
$result = $s3Client->putObject([
'Bucket' => 'some-bucket',
'Key' => $fileName,
'SourceFile' => $this->getParameter('photos_directory') . $fileName,
]);
} catch (AwsException $e) {
echo $e->getMessage() . "\n";
}
我已经测试过在构造函数中传递新元素'credentials',就像它们在其unit tests中传递的一样,并且错误是相同的。
答案 0 :(得分:0)
步骤1:确保文件/app/.aws/credentials
不存在。如果它确实存在并且为空,则您将出现一个凭证错误。
第2步:将客户代码更改为以下内容:
use Aws\Credentials\CredentialProvider;
$s3Client = new S3Client([
'profile' => 'default',
'region' => 'some-region',
'version' => 'latest',
credentials' => CredentialProvider::env()
]);
如果这不能解决您的问题,则说明您拼写了环境变量,或者没有导出它们,以便您的程序可以看到它们。
如果这行得通,那么其他地方还有无效的凭据。
答案 1 :(得分:0)
问题在于将配置文件定义为“默认”。当我删除配置文件参数时,错误消失了。
使用最新版本3.67.8时,发生以下错误:
AWS HTTP error: Client error: `PUT https: // some-url` resulted in a` 403 Forbidden`
无论如何,就我而言,在这两个版本中,都忽略profile参数是解决方案。