好的,所以我尝试了几种方法将文件上传到我的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-未找到。
如有任何帮助/建议,我们将不胜感激。我觉得我在这里有点绕圈子!
以下是一些需要仔细检查的内容。
- 如果bucket是在某个区域(例如,us-west-2)中创建的,则使用该区域
[..., 'region' => 'us-west-2', ...]
实例化S3Client
'Bucket'
参数应设置为您的bucket的确切名称(例如,如果您的bucket名称为"sub.domain.com",则'Bucket'
参数应设置成'sub.domain.com'
)。不要在'Bucket'
参数中包括region或"s3.amazonaws.com"(即bucket!=端点)。SDK会自动确定端点(基于客户端的区域和提供的bucket名称),并在需要时调整路径样式的URL-
PutObject操作需要
'Key'
参数,该参数在上面的代码示例中不存在