AWS PHP SDK将文件上传到S3时出现令人困惑的错误


AWS PHP SDK upload file to S3 confusing errors

好的,所以我尝试了几种方法将文件上传到我的S3帐户。终于发现自己有所进展,BOOM——令人困惑的文档和奇怪的错误消息似乎自相矛盾。

好吧,首先我没有使用composer或类似的东西,我是用老式的方式来做的:

require '/path/to/aws-autoload.php';

现在这个加载是正确的,我已经减少了自动加载,只使用Common和S3类——不需要所有东西!

接下来我加载S3客户端和凭据:

use Aws'S3'S3Client;
use Aws'Common'Credentials'Credentials;

现在开始魔术发生的代码:

$file = '/path/to/' . $filename;
$credentials = new Credentials('KEY', 'SECRET KEY');
$s3 = S3Client::factory(array('credentials' => $credentials));
try{
$s3->putObject(array(
    'Bucket' => 'sub.domain.com.s3.amazonaws.com',
    'Body'   => fopen($file, 'r'),
    'ACL'    => 'public-read',
));
} catch (S3Exception $e) {
     $result = array(
         'ok' => false,
         'descr' => 'There was an error uploading the file to S3 : ' . $filename
     );
}

我似乎遇到的问题是"水桶"本身。

当我将Bucket格式化为sub.domain.com时,我从AWS API得到以下消息:

AWS错误消息:您试图访问的bucket必须使用指定的端点进行寻址。请将所有未来的请求发送到此端点:"sub.domain.com.s3.amazonaws.com".

现在,当我更改"Bucket"以匹配上面的内容时,如下所示:sub.domain.com.s3.amazonaws.com

我收到以下错误消息:

AWS错误消息:指定的bucket不存在

我做错什么了吗?有什么东西不见了吗?遗憾的是,AWS文档并不完全符合要求。API目前似乎自相矛盾。我知道所有的密钥都是正确的,所有的权限都正确。根据自己的建议,它从301-重定向到404-未找到。

如有任何帮助/建议,我们将不胜感激。我觉得我在这里有点绕圈子!

以下是一些需要仔细检查的内容。

  1. 如果bucket是在某个区域(例如,us-west-2)中创建的,则使用该区域[..., 'region' => 'us-west-2', ...]实例化S3Client
  2. 'Bucket'参数应设置为您的bucket的确切名称(例如,如果您的bucket名称为"sub.domain.com",则'Bucket'参数应设置成'sub.domain.com')。不要在'Bucket'参数中包括region或"s3.amazonaws.com"(即bucket!=端点)。SDK会自动确定端点(基于客户端的区域和提供的bucket名称),并在需要时调整路径样式的URL
  3. PutObject操作需要'Key'参数,该参数在上面的代码示例中不存在