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