结合Intervention Image和Amazon S3,我希望能够从S3中提取文件,然后使用Image
进行一些裁剪。这就是我到目前为止,为什么Storage::get()
会返回false
?
$path = 'uploads/pics/123.jpeg';
$exists = Storage::disk('s3')->exists($path); // returns true
$image = Storage::disk('s3')->get($path); // returns false
从S3方面来看,存储桶权限设置为“每个人”,Storage::getVisibility()
返回public
...我不知道为什么我无法加载图像,就好像这是一个本地形象。
答案 0 :(得分:8)
在深入挖掘代码后,我发现了这条消息
"Error executing "GetObject" on "file"; AWS HTTP error: file_exists(): open_basedir restriction in effect. File(/etc/pki/tls/certs/ca-bundle.crt) is not within the allowed path(s): (paths)"
首先看来我的服务器没有这个文件,但它有!该文件位于另一个文件夹中。
/etc/ssl/certs/ca-certificates.crt
所以,为了解决我在Ubuntu中的问题,我必须创建这个文件夹/etc/pki/tls/certs
,之后,将符号链接到正确的文件:
cd /etc/pki/tls/certs;
sudo ln -s /etc/ssl/certs/ca-certificates.crt ca-bundle.crt;
修改您的php.ini
并将/etc/pki/tls/certs/ca-bundle.crt
添加到open_basedir
配置。
重启你的php服务器!
对我而言,它解决了这个问题,希望它有所帮助!
答案 1 :(得分:4)
Amazon S3为所有地区的S3存储桶中的新对象的PUTS提供了读写后一致性,但有一点需要注意。需要注意的是,如果您在创建对象之前对密钥名称发出HEAD或GET请求(以查找对象是否存在),则Amazon S3会为写入后写入提供最终一致性。
给定示例代码,其中路径是静态的,并且在get之前进行了存在调用,我猜测你正在被最终的一致性所击中。你的获得应该最终回归。尝试:
$backoff = 0;
while (false === ($image = Storage::disk('s3')->get($path))) {
if (5 < $backoff) {
throw new \RuntimeException;
}
sleep(pow(2, $backoff++));
}
答案 2 :(得分:0)
如果您使用的是laravel 5,请申请此方法。
$photo = $attributes['banner_image'];
$s3 = AWS::createClient('s3');
try {
$response = $s3->putObject([
'Bucket' => 'gfpressreleasephotos',
'Key' => str_random(8) . '.' . str_replace(' ', '-', strtolower($photo->getClientOriginalName())),
'Body' => fopen($photo->getRealPath(), 'r'),
'ACL' => 'public-read',
]);
if ($response->get('ObjectURL') != null) {
$photourl = $response->get('ObjectURL');
} else {
$photourl = $response->get('Location');
}
$attributes['banner_image'] = $photourl;
} catch (S3Exception $e) {
return "There was an error uploading the file.\n";
}