Создание превьюшки
Для работы с изображениями я использую библиотеку intervention
, более подробно можно посмотреть на официальном сайте.
Например при добавлении нового поста, нужно создавать два уменьшенных изображения и сохранять путь к ним в базе данных. Для этого необходимо установить пакет intervention/image
с помощью composer
:
composer require intervention/image
Открываем файл config/app.php
и добавляем следующие строки:
config/app.phpreturn [
'providers' => [
Intervention\Image\ImageServiceProvider::class,
],
'aliases' => [
'Image' => Intervention\Image\Facades\Image::class,
]
]
Исходный файл изображения будем сохранять без изменений в директорию storage/public/image/source
, а уменьшенные копии — в директории storage/public/image/image
и storage/public/image/thumb
. Так что эти три директории нужно сразу создать. Кроме того, добавить в таблицу БД posts
еще одно поле thumb
.
app/Http/Controllers/PostController.phpclass PostController extends Controller {
public function store(Request $request) {
$post = new Post();
$post->author_id = rand(1, 4);
$post->title = $request->input('title');
$post->excerpt = $request->input('excerpt');
$post->body = $request->input('body');
$source = $request->file('image');
if ($source) {
// меняем расширение
$ext = str_replace('jpeg', 'jpg', $source->extension());
// уникальное имя файла, под которым сохраним его в storage/image/source
$name = md5(uniqid());
// вручную указываем имя файла
Storage::putFileAs('public/image/source', $source, $name. '.' . $ext);
// создаем jpg изображение размером 1200x400, качество 100%
$image = Image::make($source)
->resizeCanvas(1200, 400, 'center', false, 'dddddd')
->encode('jpg', 100);
// сохраняем изображение под именем $name.jpg в директории public/image/image
Storage::put('public/image/image/' . $name . '.jpg', $image);
// уничтожаем изображение
$image->destroy();
// записываем в базу путь к файлу
$post->image = Storage::url('public/image/image/' . $name . '.jpg');
// создаем jpg изображение размером 600x200, качество 100%
$thumb = Image::make($source)
->resizeCanvas(600, 200, 'center', false, 'dddddd')
->encode('jpg', 100);
// сохраняем изображение под именем $name.jpg в директории public/image/thumb
Storage::put('public/image/thumb/' . $name . '.jpg', $thumb);
// уничтожаем изображение
$thumb->destroy();
// записываем в базу путь к файлу
$post->thumb = Storage::url('public/image/thumb/' . $name . '.jpg');
}
// сохраняем запись в базу
$post->save();
return redirect()->route('post.index')->with('success', 'Новый пост успешно создан');
}
}
Все готово, осталось только добавить шаблоны:
<img src="{{ $post->thumb ?? asset('img/default.jpg') }}" alt="" class="img-fluid">