这让我发疯——我已经研究这个问题好几天了,但收效甚微。我终于碰壁了,需要帮助。我搜索的很多文章和论坛都不是 AWSSDK for PHP 2。
在过去的几年里,我们一直在使用 Amazon 的 S3 通过 iOS 加载图像。
现在,我需要在浏览器中实现上传。
我已经在我们的 Ubuntu 服务器上下载并成功安装了 AWSSDK for PHP 2。我可以连接到我们的 AWS S3 帐户并显示存储桶的内容。但是我无法将图像放入存储桶中。
来自 AWS 的异常是:
Aws\S3\Exception\NotImplementedException:AWS 错误代码:NotImplemented,状态代码:501,AWS 请求 ID:CEDC4BBAA83CF70C,AWS 错误类型:服务器,AWS 错误消息:您提供的标头暗示不具备的功能实施的。
这是我从中获取以下示例代码的 URL,在名为 Uploading a File to Amazon S3 的标题下: https ://github.com/aws/aws-sdk-php#quick-start
我基于此更新了我的代码: AWS PHP SDK Version 2 S3 putObject Error
但它仍然不起作用。
这是我的代码:
<?php
require_once("../config.php"); //local config vars
require_once('AWSSDKforPHP/aws.phar');
use Aws\S3\S3Client;
use Aws\Common\Enum\Region;
use Aws\Common\Aws;
use Aws\S3\Enum\CannedAcl;
use Aws\S3\Exception\S3Exception;
use Guzzle\Http\EntityBody;
//get the $s3 object
$config = array(
'key' => AMAZON_ACCESS_KEY,
'secret' => AMAZON_ACCESS_SECRET,
'region' => Region::US_EAST_1
);
$s3 = S3Client::factory($config);
try {
$bucketname = 'my_bucket_name'; //my bucket name on s3
$filename = 'filename.jpg'; //my image on my server
$path = 'http://my.website.com/app/cache/remote'; //the path where the image is located
$fullfilename = $path."/".$filename;
//this successfully lists the contents of the bucket I am interested in
foreach ($s3->getIterator('ListBuckets') as $bucket) {
foreach ($s3->getIterator('ListObjects', array('Bucket' => $bucket['Name'])) as $object) {
if ( $bucket['Name'] == $bucketname ) {
echo $bucket['Name'] . '/' . $object['Key'] . PHP_EOL;
}
}
}
//HERE ME HERE, PLEASE! this is the code that throws the exception
$s3->putObject(array(
'Bucket' => $bucketname,
'Key' => $filename,
'Body' => EntityBody::factory(fopen($fullfilename, 'r')),
'ACL' => CannedAcl::PUBLIC_READ_WRITE,
'ContentType' => 'image/jpeg'
));
} catch (S3Exception $e) {
echo $e;
}
?>
有人可以为我提供一个示例,以便我可以使用 AWSSDK for PHP 2 将 JPG 图像上传到 S3 上的存储桶中吗?
解决方案:从 ppostma1 的回复中,我修改了我的代码如下,现在它可以工作了:
$bucketname = 'my_bucket_name'; //must be all lowercase
$filename = 'filename.jpg'; //my image on my server
$path = 'var/www/html/root-website-folder/images/'; //the physical path where the image is located
$fullfilename = $path.$filename;
$s3->putObject(array(
'Bucket' => $bucketname,
'Key' => $filename,
'Body' => EntityBody::factory(fopen($fullfilename, 'r')),
'ACL' => CannedAcl::PUBLIC_READ_WRITE,
'ContentType' => 'image/jpeg'
));