загрузка фото пользователя laravel

160
15 декабря 2018, 08:00

как обработать загрузку фото профиля пользователя

<form action="{{ route('updateuser') }}" enctype="multipart/form-data" method="POST" class="grid">
                    {{ csrf_field() }}
                    <div class="item data-photo">
                        <div class="data-name-profile">
                            <div class="file-upload">
                                <label>
                                    <input type="file" name="newphoto" id="photo" value="{{ $profile->attributes->photo }}">
                                    <span>Редактировать фото</span>
                                </label>
                            </div>
                        </div>
                    </div>
                    <div class="item data-info">
                        <div class="data-contacts">
                            <p>День рождения: <span>{{ $profile->attributes->birthday }}</span></p>
                            <p>Город: <span>{{ $profile->attributes->city }}</span></p>
                            <p>Номер телефона: <span>{{ $profile->attributes->phone }}</span></p>
                        </div>
                    </div>
                    <div class="item data-save">
                        <div class="data-item date">
                            <label for="">Дата рождения:</label>
                            <input type="date" placeholder="14 сентября 1992" name="birthday" value="{{ $profile->attributes->birthday }}">
                        </div>
                        <div class="data-item">
                            <label for="">Город:</label>
                            <input type="text" placeholder="Москва" name="city" value="{{ $profile->attributes->city }}">
                        </div>
                        <div class="data-item">
                            <label for="">Номер телефона:</label>
                            <input type="text" placeholder="14 сентября 1992" name="phone" value="{{ $profile->attributes->phone }}">
                        </div>
                        <div class="data-item cart">
                            <label for="">Номер карты или Яндекс-кошелек::</label>
                            <input type="text" placeholder="410017100674849" name="pay" value="{{ $profile->attributes->pay }}">
                        </div>
                        <div class="data-lesson">
                            <p class="title">Интересующие предметы:</p>
                            <div class="item">
                                <label for="">Экзамен/цель</label>
                                <select name="sessia" id="" class="select">
                                    <option value="">ЕГЭ</option>
                                </select>
                            </div>
                            <div class="item">
                                <label for="">Предмет</label>
                                <select name="training" id="" class="select">
                                    <option value="">Математика</option>
                                </select>
                            </div>
                        </div>
                        <button type="submit" class="btn-green">Сохранить изменения</button>
                    </div>
                </form>\

в таблице users есть поле photo, как в контроллере обработать и перекинуть фото в папку images?

Answer 1

Простой вариант:

if ($request->hasFile('photo')) {
    $destinationPath = public_path('uploads/avatars/');
    $fileName = $user->id . '.jpg'; 
    $request->file('photo')->move($destinationPath, $fileName);
    $user = auth()->user();
    $user->image  = $destinationPath . $fileName;
    $user->save();
}

Если надо хранить аватар нескольких размеров, я сделал так:

Я использую Intervention Image для работы с картинками.

В бд есть столбец avatar:

$table->json('avatar')->nullable();

В модели:

protected $casts = [
    'avatar' => 'array'
];

Создал trait для того чтобы менять avatar(он у меня менялся не только в одном контроллере)

namespace App\Traits;
use File;
trait Avatar
{
    /**
     * Ставит аватарку под все размеры
     */
    public function setUserAvatar($user, $img) { // TODO interface Image
        // сохраняет начальный статус(когда только обрезана)
        $img->backup();
        $sizes = [
            'lg' => 320,
            'md' => 200,
            'sm' => 133,
            'circle' => 80
        ];
        $avatar = [];
        foreach ($sizes as $sizeName => $width) {
            $avatar[$sizeName] = $this->saveAvatarBySize($user, $img, $sizeName, $width);
        }
        $user->avatar = $avatar; // json поле для аватарок
        $user->save();

        return $avatar;
    }

    protected function saveAvatarBySize($user, $img, $sizeName, $width) {
        $folderPath =  "avatars/$user->id";
        $folderPathFull = public_path($folderPath);
        $filePath = "$folderPath/$sizeName.jpg";
        if (!File::exists($folderPathFull)) {
            File::makeDirectory($folderPathFull, 0777, true, true);
        }
        $img->resize($width, null, function ($constraint) {
            $constraint->aspectRatio();
        })->save(public_path($filePath));
        // возвращает к состоянию когда был сделан бэкап $img->backup() (тогда была только обрезаность)
        $img->reset();

        return config('app.url') . '/' . $filePath . '?' . rand();
    }
}

Потом в контроллер добавил trait:

use App\Traits\Avatar;
class ProfileController extends BaseController
{
    use Avatar;

И в методе роута делал так:

public function setAvatar(SaveAvatarRequest $request) {
    $user = auth()->user();
    $cropInfo = json_decode($request->cropInfo, true);
    $file = $request->file('file');
    $img = Image::make($file);
    // Если у Вас есть данные для crop
    // ->crop(
    //     $cropInfo['width'],
    //     $cropInfo['height'],
    //     $cropInfo['x'],
    //     $cropInfo['y']
    // );
    $avatar = $this->setUserAvatar($user, $img);
    // это я возвращал измененного пользователя
    // return new UserResource($user);
}
READ ALSO
Отправка аттача с формы Tilda на почту

Отправка аттача с формы Tilda на почту

Есть форма на тильде, ссылка на форму, к ней надо подсоединить свой скрипт phpСкрипт пишу при помощи phpmail(желание заказчика)

319
Вывод названия таксономии WordPress

Вывод названия таксономии WordPress

Есть сайт на WordPressВ нём присутствует таксономия location

163
авторизация на сайте cUrl

авторизация на сайте cUrl

есть корпоративный сервис, хочу к нему подцепиться для дальнейшего парсинга с помощью cUrlв Form Data отправляются следующие значения:

123
Laravel и Tarantool?

Laravel и Tarantool?

Кто нибудь пользуется новой БД Tarantool ? говорят очень производительная, но официальный сайт ведет на библиотеку в гитхаб, где только можно...

110