我尝试创建/修改配置文件,但是当我想在配置文件中添加图像时,它不起作用并且不会加载到数据库中。
ProfileController
class ProfileController extends Controller
{
public function show(User $user)
{
return view('profile.show', compact('user'));
}
public function edit(User $user)
{
$this->authorize('update', $user->profile);
return view('profile.edit', compact('user'));
}
public function update(User $user)
{
$this->authorize('update', $user->profile);
$data = request()->validate([
'description' => 'required',
'image' => 'sometimes|image|max:3000'
]);
if (request('image')) {
$imagePath = request('image')->store('avatars', 'public');
$image = Image::make(public_path("/storage/{$imagePath}"))->fit(800, 800);
$image->save();
auth()->user()->profile->update(array_merge($data,
['image' => $imagePath]
));
} else {
auth()->user()->profile->update($data);
}
auth()->user()->profile->update($data);
return redirect()->route('profile.show', ['user' => $user]);
}
}
用户
class User extends Authenticatable implements MustVerifyEmail
{
use Notifiable;
protected $fillable = [
'username', 'nom', 'prenom', 'adresse', 'ville',
'codepostale', 'datedenaissance', 'email', 'password',
];
protected $hidden = [
'password', 'remember_token',
];
protected $casts = [
'email_verified_at' => 'datetime',
];
protected static function boot()
{
parent::boot();
static::created(function ($user) {
$user->profile()->create([
'description' => $user->username
]);
});
}
public function getRouteKeyName()
{
return 'username';
}
public function profile()
{
return $this->hasOne('App\Profile');
}
public function posts()
{
return $this->hasMany('App\Post')->orderBy('created_at', 'DESC');
}
}
show.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<div class="col-4">
<img src="{{ $user->profile->getImage() }}" class="rounded-circle w-100" alt="" style="max-width: 240px;">
</div>
<div class="col-8">
<div class="d-flex align-items-baseline">
<div class="h4 mr-3 pt-2">{{ $user->username }}</div>
<button class="btn btn-primary">S'abonner</button>
</div>
<div class="d-flex">
<div class="mr-3">{{ $user->posts->count() }} article(s) en vente
</div>
@can('update', $user->profile)
<a href=" {{ route('profile.edit', ['username' => $user->username]) }}">Modifier Profile</a>
@endcan
<div class="mt-3">
<div class="font-weight-bold">
{{ $user->profile->title }}
</div>
</div>
</div>
</div>
<div class="row mt-5">
@foreach ($user->posts as $post)
<div class="col-4">
<a href="{{ route('posts.show', ['post' => $post->id]) }}">
<img src="{{ asset('storage') . '/' . $post->image }}" alt="" class="w-100">
</a>
</div>
@endforeach
</div>
</div>
</div>
@endsection
edit.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">Modifier profile</div>
<div class="card-body">
<form method="POST" action="{{ route('profile.update', ['user' => $user]) }}" enctype="multipart/form-data">
@csrf
@method('PATCH')
<div class="form-group">
<label for="description">Description</label>
<div class="col-md-6">
<textarea id="description" type="text" class="form-control @error('description') is-invalid @enderror" name="description" autocomplete="description" autofocus>{{ old('description') ?? $user->profile->description }}</textarea>
@error('description')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group">
<div class="custom-file">
<input type="file" name="image" class="custom-file-input @error('image') is-invalid @enderror" id="validatedCustomFile" >
<label class="custom-file-label" for="validatedCustomFile">Choisir une image</label>
@error('image')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="col-md-6 offset-md-4">
<button type="submit" class="btn btn-primary">
Modifier profile
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
Profile.php
class Profile extends Model
{
protected $fillable = ['description'];
public function user()
{
return $this->belongsTo('App\User');
}
public function getImage()
{
$imagePath = $this->image ?? 'avatars/default.png';
return "/storage/" . $imagePath;
}
}
create_profiles_tables.php
class CreateProfilesTable extends Migration
{
public function up()
{
Schema::create('profiles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->text('description')->nullable();
$table->string('image')->nullable();
$table->unsignedBigInteger('user_id')->index();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('profiles');
}
}
我不知道在数据库中上传图片和更改个人资料图片有什么问题,有人可以帮忙吗?
答案 0 :(得分:0)
在这种情况下,您尝试更新用户相关的个人资料模型的图像字段。
auth()->user()->profile->update(array_merge($data,
['image' => $imagePath]
));
但是,在您的个人资料模型中,图片是不允许进行批量分配的字段。
protected $fillable = ['description'];
您应将其更改为:
protected $fillable = ['description','image'];
希望这会有所帮助,祝你好运!
编辑
关注空白图像问题。
基于我链接的其他解决方案,我可以从文档中确定使用干预图像包的方法有多种。
尝试更改此内容:
$image = Image::make(public_path("/storage/{$imagePath}"))->fit(800, 800);
$image->save();
对此:
$image = Image::make(Input::file('image'))->fit(800, 800);
$image->save(public_path("/storage/{$imagePath}"));
也许这种方法会带来更好的运气,就像用户在另一个线程中所做的那样。
干预图像(文档)
make()
http://image.intervention.io/api/make
save()
http://image.intervention.io/api/save
编辑
进一步的跟进
您是否已正确链接公共存储?如果没有,这可能是一个促成因素。
php artisan storage:link
对我来说,远程调试您的应用非常困难。但是我将从创建一些简单的控制器方法进行测试开始。
首先,创建一个控制器方法以返回已知的良好图像。这将是您直接放置在服务器上特定位置的一个。然后相应地引用该路径,并从路由中调用该方法。
public function untouchedImage()
{
$path = public_path('images/known-good-image.png');
return response()->file(public_path($path);
}
然后,如果上面的图像正确显示,请创建另一个控制器方法。引用完全相同的文件位置,但尝试输出调整大小的图像。
public function resizedImage()
{
$path = public_path('images/known-good-image.png');
$image = Image::make(path)->resize(40,40);
return $image->response('png');
}
如果这可行,则问题可能出在图像路径上。保存图像时,您需要在应用程序中逐行转储路径,以查看发生了什么问题。
如果它不起作用,则可能是Laravel或PHP在某处配置错误。您的服务器上是否装有正确的PHP映像库?默认情况下,它使用GD或通过配置使用Imagick。