Skip to content

修改头像

修改头像的话,我们需要使用到了解 laravel 文件存储系统。通过修改上传头像的功能,来熟悉下 laravel 文件上传还有如何存储的。如何配置对应的文件存储。

创建上传头像页面

shell
php artisan make:view user/avatar

然后找到 resources/views/user/avatar.blade.php 模板,添加如下代码

html
<div>
  <x-layout>
    <x-slot:header>个人资料</x-slot:header>

    <div class="text-xl">修改头像</div>
    <div class="w-full lg:w-1/2">
      <img src="{{$avatar}}" class="w-16 h-16" />
      <form class="mt-10 space-y-6" action="{{ route('update.avatar')}}" method="POST" enctype="multipart/form-data">
        @if (session('success'))
        <div class="alert alert-success">{{ session('success') }}</div>
        @endif
        <label class="input input-bordered flex items-center gap-2 @error('avatar') input-error @enderror">
          <input type="file" class="avatar" placeholder="头像" name="avatar" value="" />
        </label>
        @error('avatar')
        <div class="text-white alert alert-error">{{ $message }}</div>
        @enderror
        <div>
          <button
            type="submit"
            class="flex justify-center px-3 py-1.5 w-full font-semibold text-white bg-indigo-600 rounded-md shadow-sm text-sm/6 hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600">
            更 新
          </button>
        </div>
        @csrf
      </form>
    </div>
  </x-layout>
  <!-- The best way to take care of the future is to take care of the present moment. - Thich Nhat Hanh -->
</div>

如下图所示 laravel入门教程-上传头像

上传头像方法

然后找到 app/Http/Controllers/UserController.php 控制器,添加如下代码

php
// 上传头像
public function updateAvatar(Request $request)
{
    if ($request->isMethod('POST')) {
        $request->validate([
            'avatar' => 'required|image|mimes:jpeg,png,jpg|max:1024',
        ], [
            'avatar.required' => '请选择头像',
            'avatar.image' => '请选择图片',
            'avatar.mimes' => '请选择 jpeg,png,jpg,gif,svg 格式的图片',
            'avatar.max' => '图片大小不能超过 1MB',
        ]);

        $file = $request->file('avatar');
        $fileName = $file->getClientOriginalName();
        // 保存到 storage 目录下的 app/public/avatars 目录下
        // 这里使用的是 public 磁盘,你也可以使用 local 磁盘,具体可以看文档
        $filePath = $file->storeAs('avatars', $fileName, 'public');

        $user = $request->user();
        $user->avatar = $filePath;
        $user->save();

        return to_route('update.avatar')->with(['success' => '更新头像成功']);

    } else {
        return view('user.avatar', [
            'avatar' => Auth::user()?->avatar
        ]);
    }
}

配置文件存储

config/filesystems.php 文件中,找到下面的配置。上传头像的话,我们使用的是 public 磁盘,你也可以自定义磁盘。具体可以查看上面提到文档

php
return [
    'disks' => [
        'public' => [
            'driver' => 'local',
            'root' => storage_path('app/public'),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public',
            'throw' => false,
        ],
    ]
]

添加路由

php
# 更新头像
Route::match(['get', 'post'], '/update/avatar', 'updateAvatar')->name('update.avatar'); 

添加头像字段

shell
php artisan make:migration add_avatar_to_users_table

然后找到 database/migrations/2024_05_18_103569_add_avatar_to_users_table.php 迁移文件,添加如下代码

php
Schema::table('users', function (Blueprint $table) {
    $table->string('avatar')->nullable()->comment('头像');
});

然后执行迁移

shell
php artisan migrate

最后,我们在 app/Models/User 模型中添加 avatar 方法,返回 Attribute 属性。 这样就可以在视图中使用 $user->avatar 来获取头像了

php
use Illuminate\Database\Eloquent\Casts\Attribute; 

// 头像
protected function avatar():Attribute
{
    return Attribute::make(
        get: fn($value) => Storage::disk('public')->url($value)
    );
}

添加软连接

在上传头像之后,你会发现头像还是无法显示的,这是因为我们没有创建软连接。使用下面的命令

shell
php artisan storage:link

执行之后,刷新页面之后,头像就会正常显示了。 laravel入门教程-上传头像

这样就完成了头像的上传了。总结一下这节内容,主要涉及到的知识点有

  • 文件存储系统
  • 文件上传
  • 文件存储
  • 文件软连接