Storage:: get() с использованием Amazon S3 возвращает false

Объединяя оба 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... Я не уверен, почему я не могу загрузить изображение, как если бы оно было локальным изображение.

Ответы

Ответ 1

После углубления в код я нашел это сообщение

"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-сервер!

Для меня это решает проблему, надеюсь, что это поможет!

Ответ 2

Из Документация Amazon S3:

Amazon S3 обеспечивает согласованность после записи для PUTS новых объектов в вашем ведре S3 во всех регионах с одним оговоркой. Предостережение заключается в том, что если вы создаете запрос HEAD или GET к имени ключа (чтобы определить, существует ли объект) перед созданием объекта, Amazon S3 обеспечивает возможную согласованность для чтения после записи.

Учитывая пример кода, в котором путь является статическим, а существующий вызов выполняется до получения, я предполагаю, что вы попадаете с возможной последовательностью. В конечном итоге ваш доход должен вернуться. Попробуйте:

$backoff = 0;
while (false === ($image = Storage::disk('s3')->get($path))) {
    if (5 < $backoff) {
        throw new \RuntimeException;
    }
    sleep(pow(2, $backoff++));
}

Ответ 3

Если вы используете 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";
            }