Загрузка фотографий и документов - один из самых распространенных вариантов использования в веб-разработке. Если вы только начали, вы узнаете, как создавать формы, отправлять сообщения и загружать файлы. Если вы знакомы с формой, Laravel сэкономит ваше время от повторения кода перемещения загруженного файла из временной папки в папку приложения.

Прежде всего, загрузите проект.

Создать новый проект

// Terminal
composer create-project --prefer-dist laravel/laravel photo-management

Давайте начнем.

Создать контроллер ресурсов

Laravel предоставляет удобную команду для создания контроллера CRUD.

// Terminal
php artisan make:controller PhotoController --resource
Controller created successfully.

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

// routes/web.php
Route::resource('/', 'PhotoController’);

Затем создайте пользовательский интерфейс.

Создание пользовательского интерфейса

Вы создаете файл макета, который используется во всем приложении.

// resources/views/layouts/app.blade.php
<!doctype html>
<html lang="{{ app()->getLocale() }}">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title>Photo Management</title>

    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css"; integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous">

    <!-- Styles -->
    <style>
        body {
            height: 100vh;
        }
    </style>
</head>
<body>
<div class="d-flex justify-content-center align-items-center" style="height: 100%">
    @yield('content')
</div>
</body>
</html>

Создайте блейд-файл, расширяющий файл макета. В блейд-файл вы добавляете форму с вводом файла и кнопкой отправки.

// resources/views/index.blade.php
@extends('layouts.app')

@section('content')
<form>
    {{ csrf_field() }}
    <div class="form-group">
        <label class="custom-file">
            <input type="file" name="photo" class="custom-file-input">
            <span class="custom-file-control"></span>
        </label>
    </div>
    <button type="submit" class="btn btn-primary">Submit</button>
</form>
@endsection

Создайте блейд-файл для отображения сообщения об успешном выполнении.

// resources/views/success.blade.php
@extends('layouts.app')

@section('content')
    <h2>Upload succeed!</h2>
@endsection

Затем настройте форму загрузки.

Настроить форму загрузки

В нормальной форме при отправке формы на сервер передается строковое значение. Фотография не является строковым значением. С помощью атрибута enctype вы можете кодировать фотографию при отправке на сервер.

// resources/views/index.blade.php
<form method="POST" action="/" enctype="multipart/form-data”>
…
</form>

После отправки формы вы получите загруженную фотографию.

Получить загруженное фото

Вы можете получить доступ к загруженной фотографии с помощью метода file в Illuminate \ Http \ Request.

// app/Http/Controllers/PhotoController.php
public function store(Request $request)
{
    $path = $request->file('photo')->store('images');

    return view('success');
}

Получите загруженный файл и сохраните его в папке с именем images в папке для хранения.

По умолчанию метод store генерирует уникальный идентификатор, который будет служить именем файла. Не волнуйся. Вы всегда можете сохранить файл с желаемым именем.

Магазин с произвольным именем файла

Используйте метод storeAs, он принимает второй аргумент в качестве настраиваемого имени файла. Вы объединяете имя файла с расширением. В противном случае фотография будет сохранена без расширения.

// app/Http/Controllers/PhotoController.php
public function store(Request $request)
{
    $extension = $request->file('photo')->extension();
    $path = $request->file('photo')->storeAs('images', 'my_photo.' . $extension);

    return view('success');
}

Что дальше

В следующем руководстве будет рассказано о проверке загружаемого файла.

Если вы еще не подписались на мой список рассылки на домашней странице, сделайте это сейчас. Я сообщу вам, когда будет опубликовано новое руководство.

Я говорил вам, что вы получите серию БЕСПЛАТНЫХ уроков при подписке? Пойдите, проверьте это.

Будьте на связи.

Первоначально опубликовано в Я учу вас кодировать.