使用Amazon S3的Storage :: get()返回false

时间:2016-11-16 21:39:28

标签: laravel amazon-s3

结合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 ...我不知道为什么我无法加载图像,就好像这是一个本地形象。

3 个答案:

答案 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 documentation

  

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";
            }