Mar*_*ies 10 php amazon-s3 amazon-web-services
我正在尝试使用AWS SDK for PHP以编程方式将文件上传到设置为S3控制台中的静态网站的存储桶.
该桶名为foo.ourdomain.com,托管在欧洲西部.我正在使用以下代码尝试测试是否可以上传文件:
$client = \Aws\S3\S3Client::factory(array('key' => bla, 'secret' => bla));
$client->upload('foo.ourdomain.com', 'test.txt', 'hello world', 'public-read');
Run Code Online (Sandbox Code Playgroud)
这与示例中的非常相似,但是,我收到以下异常:
PHP致命错误:未捕获的Aws\S3\Exception\PermanentRedirectException:AWS错误代码:PermanentRedirect,状态代码:301,AWS请求ID: - ,AWS错误类型:客户端,AWS错误消息:您尝试访问的存储桶必须得到解决使用指定的端点.请将以后的所有请求发送到此端点:"foo.ourdomain.com.s3.amazonaws.com".,User-Agent:aws-sdk-php2/2.4.8 Guzzle/3.7.4 curl/7.22.0 PHP/5.3 .10-1ubuntu3.8
此时我感到很惊讶,因为在S3 SDK的手册中没有提到这一点.但好吧,我找到了一个方法setEndpoint并将代码调整为:
$client = \Aws\S3\S3Client::factory(array('key' => bla, 'secret' => bla));
$client->setEndpoint('foo.ourdomain.com.s3.amazonaws.com');
$client->upload('foo.ourdomain.com', 'test.txt', 'hello world', 'public-read');
Run Code Online (Sandbox Code Playgroud)
我认为这有用,但我得到了完全相同的错误.我已经进行了双重检查,并且在byte-for-byte异常中提到的端点与我在第二行中设置的端点匹配.
我也尝试使用foo.ourdomain.com.s3-website-eu-west-1.amazonaws.com作为端点(这是我们的CNAME根据S3控制台指令指向的主机).也没用.
我必须遗漏一些东西,但我无法在任何地方找到它.也许设置为"静态网站"的存储桶的行为方式与SDK当前不支持的方式不同?如果是这样,我在文档和管理控制台中都找不到它.
Mar*_*ies 19
得到它了.解决方案是将客户端的初始化更改为:
$client = \Aws\S3\S3Client::factory(array('key' => bla, 'secret' => bla, 'region' => 'eu-west-1'));
Run Code Online (Sandbox Code Playgroud)
即不是指定我需要在options数组中显式设置区域的端点.我猜示示例代码恰好使用默认区域.
如果您不想将客户端初始化为特定区域和/或您需要使用不同的区域,我已成功使用getBucketLocation/setRegion调用集,如下所示:
// Bucket location is fetched
$m_bucketLocation = $I_s3->getBucketLocation(array(
'Bucket' => $s_backupBucket,
));
// Bucket location is specified before operation is made
$I_s3->setRegion($m_bucketLocation['Location']);
Run Code Online (Sandbox Code Playgroud)
我有一个额外的电话,但解决了我的问题,而无需干预工厂.