AWS PHP SDK上传文件导致S3混乱

时间:2014-10-07 09:11:00

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

好的,所以我尝试了几种获取文件上传到我的S3帐户的方法。终于发现自己到了某处和BOOM - 令人困惑的文档和奇怪的错误信息似乎与自己相矛盾。

好的,首先我不使用作曲家或类似的东西,我这样做是老式的:

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

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

接下来我加载S3 Client和Credentials:

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”本身。

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

  

AWS错误消息:您尝试访问的存储区必须使用指定的端点进行寻址。请将以后的所有请求发送到此端点:“sub.domain.com.s3.amazonaws.com”。

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

我收到以下错误消息:

  

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

我做错了吗?缺少什么?遗憾的是,AWS文档并不是最新的。 API目前似乎自相矛盾。我知道所有的密钥都是正确的,并且所有权限都是正确的。它从301 - Redirect变为404 - Not Found from its advice。

任何帮助/建议将不胜感激。我觉得我在这里走了一圈!

1 个答案:

答案 0 :(得分:4)

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

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