AWS PHP SDK将文件上载到S3时出错

AWS PHP SDK将文件上载到S3时出错,php,amazon-web-services,amazon-s3,aws-php-sdk,Php,Amazon Web Services,Amazon S3,Aws Php Sdk,好的,所以我尝试了几种方法来获取一个文件上传到我的S3帐户。最后,我发现自己有了进展,出现了混乱的文档和奇怪的错误信息,这些信息似乎自相矛盾 好的,首先,我没有使用composer或类似的东西,我是用老式的方式来做的: require '/path/to/aws-autoload.php'; 现在这个加载正确了,我已经减少了自动加载,只使用普通类和S3类-不需要所有东西 接下来,我加载S3客户端和凭据: use Aws\S3\S3Client; use Aws\Common\Credentia

好的,所以我尝试了几种方法来获取一个文件上传到我的S3帐户。最后,我发现自己有了进展,出现了混乱的文档和奇怪的错误信息,这些信息似乎自相矛盾

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

require '/path/to/aws-autoload.php';
现在这个加载正确了,我已经减少了自动加载,只使用普通类和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错误消息:您试图访问的存储桶必须使用指定的端点寻址。请将所有未来的请求发送到此端点:“sub.domain.com.s3.amazonaws.com”

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

我收到以下错误消息:

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

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


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

这里有一些东西需要仔细检查

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

  • 不仅仅是
    子域
    部分用作示例吗?我认为你应该把这个值改成你最初命名的bucket。我已经这样做了,我在这里发布时将它设置为sub.domain,使它更通用,而不是泄露我工作的网站。此外,密钥和私钥设置为正确的值。如果您尝试使用
    路径样式的URL访问存储桶,如
    http://s3.amazonaws.com/
    ?是的,结果相同:
    PermanentRedirect
    必须使用指定的端点对您尝试访问的存储桶进行寻址。请将所有未来的请求发送到此endpoint.sub.domain.comsub.domain.com.s3.amazonaws.com
    尝试使用php s3客户端进行检查,以便您的bucket名称对s3 bucket有效,
    isValidBucketName($bucketName),我想问题可能是bucket名称的格式。