下面是实现点击用户头像更改头像的方法的攻略:
1. 基本思路
首先,我们需要一个用于上传头像的表单页面,并使用 Laravel 自带的表单验证和文件上传功能来处理用户上传的头像文件。然后,我们需要在用户个人信息页面上显示用户当前的头像,并且在用户点击头像上的更改按钮时,使用 Ajax 异步请求一个用于更新头像的控制器方法。最后,我们需要在控制器方法中处理头像文件的保存和更新操作。
2. 创建上传头像的表单页面
首先,我们需要创建一个上传头像的表单页面。可以在 resources/views
目录下创建一个名为 avatar.blade.php
的表单页面文件,并添加以下代码:
<form action="/upload-avatar" method="POST" enctype="multipart/form-data">
{{ csrf_field() }}
<input type="file" name="avatar">
<button type="submit">Upload Avatar</button>
</form>
该表单使用 POST
方法提交给 /upload-avatar
路由。我们还需要加上 enctype="multipart/form-data"
属性,以处理文件上传。在表单中添加一个 csrf
令牌来防止 CSRF 攻击。
3. 处理用户上传头像的请求
接下来,我们需要定义一个 /upload-avatar
路由,并将它指向我们将要创建的 AvatarController
的 store
方法:
Route::post('/upload-avatar', 'AvatarController@store');
接着,我们需要在 app/Http/Controllers
目录下创建一个名为 AvatarController
的控制器,然后添加以下代码:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Auth;
class AvatarController extends Controller
{
public function store(Request $request)
{
$this->validate($request, [
'avatar' => 'required|image'
]);
$user = Auth::user();
$extension = $request->file('avatar')->getClientOriginalExtension();
$fileName = $user->name . '_avatar.' . $extension;
$request->file('avatar')->move(public_path('uploads'), $fileName);
$user->avatar = '/uploads/' . $fileName;
$user->save();
return redirect()->back()->with('success_msg', 'Avatar uploaded successfully');
}
}
在该控制器的 store
方法中,我们使用 Laravel 自带的表单验证器,确保用户上传的文件是一张合法的图片。然后,我们使用 Auth
facade 获取当前用户的模型实例,并为其生成一个新的头像文件名。接着,我们将上传的头像文件保存到 public/uploads
目录下,并将保存后的文件路径更新到当前用户的 avatar
字段中。最后,我们重定向到当前路由的上一个页面,并将成功上传的消息通过 Laravel 的 Session 机制传递给视图。
注意:在上述控制器代码中,我们认为用户的用户名是唯一的,因此我们使用用户名作为头像文件名的一部分。如果您的用户模型有一个唯一且不变的 ID,那么使用它作为头像文件名的一部分会更好。
4. 显示用户当前头像,并添加头像更改功能
接着,我们需要在用户个人信息页面上显示用户当前的头像,并在上面添加一个更改按钮。可以在 resources/views
目录中创建一个名为 profile.blade.php
的页面,然后添加以下代码:
@if (session('success_msg'))
<div class="alert alert-success">
{{ session('success_msg') }}
</div>
@endif
<div class="avatar">
<img src="{{ Auth::user()->avatar }}" alt="User Avatar">
<a href="#" class="change-avatar">Change Avatar</a>
</div>
<form action="/update-avatar" method="POST" enctype="multipart/form-data" class="hidden" id="avatar-form">
{{ csrf_field() }}
<input type="file" name="avatar">
<button type="submit">Update Avatar</button>
</form>
<script>
var changeAvatarBtn = document.querySelector('.change-avatar');
var avatarForm = document.querySelector('#avatar-form');
changeAvatarBtn.addEventListener('click', function(e) {
e.preventDefault();
avatarForm.classList.toggle('hidden');
});
</script>
我们首先检查 Session 中是否存在名为 success_msg
的键,并根据它显示成功上传头像的消息。然后,我们使用 Auth
facade 获取当前用户的模型实例,并使用它的 avatar
字段来显示用户的当前头像。在头像下面,我们添加了一个“更改头像”的链接,用于触发头像更改表单的显示。
在表单部分,我们创建了一个默认处于隐藏状态的 form
元素,并将它的 id
设置为 avatar-form
。我们使用 multipart/form-data
格式提交该表单,以便处理文件上传。在表单中添加一个 csrf
令牌来防止 CSRF 攻击,并添加一个用于上传头像文件的 file
输入框和一个提交按钮。
在页面底部的 JavaScript 代码中,我们使用 jQuery 进行了事件处理。当用户点击“更改头像”链接时,我们使用 .toggle()
方法切换表单元素的显示状态。如果该元素是隐藏的,则它将显示出来,并且如果是显示的,则它将被隐藏起来。
5. 处理头像更新请求
最后,我们需要定义一个 /update-avatar
路由,并将它指向我们将要创建的 AvatarController
的 update
方法。然后,在 AvatarController
控制器中添加以下代码:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Auth;
class AvatarController extends Controller
{
public function store(Request $request)
{
// 处理上传头像的代码
}
public function update(Request $request)
{
$this->validate($request, [
'avatar' => 'required|image'
]);
$user = Auth::user();
$extension = $request->file('avatar')->getClientOriginalExtension();
$fileName = $user->name . '_avatar.' . $extension;
$request->file('avatar')->move(public_path('uploads'), $fileName);
$user->avatar = '/uploads/' . $fileName;
$user->save();
return redirect()->back()->with('success_msg', 'Avatar updated successfully');
}
}
在上述代码中,我们正常处理上传头像的代码已经被删除,我们只看修改update
方法,该方法基本与store
方法相同。我们首先使用 Laravel 自带的表单验证器,确保用户上传的文件是一张合法的图片。然后,我们使用 Auth
facade 获取当前用户的模型实例,并为其生成一个新的头像文件名。接着,我们将上传的头像文件保存到 public/uploads
目录下,并将保存后的文件路径更新到当前用户的 avatar
字段中。最后,我们重定向到当前路由的上一个页面,并将成功更新头像的消息通过 Laravel 的 Session 机制传递给视图。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在laravel5.2中实现点击用户头像更改头像的方法 - Python技术站