Загрузка файлов, изображений Laravel
В Laravel 5.4 чтобы загрузить файл (изображение) нужна форма следующего вида в файле create.blade.php:
<form action="/admin/page" enctype="multipart/form-data" method="post">
{{ csrf_field() }}
<div class="form-group">
<input type="text" name="title" class="form-control" placeholder="Заголовок">
</div>
<div class="form-group">
<input type="file" name="img" accept="image/*">
</div>
<button type="submit" class="btn btn-default btn-block">Опубликовать</button>
</form>
и код контроллера:
public function store(Request $request)
{
$page= new Page($request->except('img'));
if ($request->hasFile('img')) {
$file = $request->file('img');
$destinationPath = public_path().'/house/uploads/';
$filename = str_random(20) .'.' . $file->getClientOriginalExtension() ?: 'png';
$page->img = $filename;
if ($request->hasFile('img')) {
$request->file('img')->move($destinationPath, $filename);
}
}
$page->save();
return redirect()->route('page.index');
}
Есть более функциональный способ с обрезкой и маштабированием изображения.
Покажу на примере из одного моего проекта:
public function update($id, Request $request)
{
$file = Input::file('img');
$img = Image::make(Input::file('img'));
$path = public_path().'/house/uploads/';
$filename = str_random(20) .'.' . $file->getClientOriginalExtension() ?: 'png';
$img->save($path . $filename);
$img->fit(270, 200, function ($constraint) {
$constraint->upsize();
});
$img->save($path . 'trumb_' . $filename);
$foodcat = FoodCat::findOrFail($id);
$foodcat->title = $request->title;
$foodcat->browser_title = $request->browser_title;
$foodcat->slug = $request->slug;
$foodcat->description = $request->description;
$foodcat->img = $filename;
$foodcat->save();
return redirect()->route('menu.index');
}
Для этого необходимо установить на Laravel пару дополнительных библиотек:
https://laravelcollective.com/
Инструкции по инсталяции даны на официальном сайте.