Laravel 5.4+ : Mutator/Accessor 上传图片
Laravel 5.4+ : Mutator/Accessor for uploaded image
我正在尝试使用 mutator 来存储和检索用户 gravatar。
在我的用户模型中我有:
public function getGravatarAttribute($gravatar){
if($gravatar){
$image = Storage::disk('local')->get('public/avatars/'.$gravatar.'.jpg');
return new Response($image, 200);
}
$hash = md5(strtolower(trim($this->attributes['email'])));
return "http://www.gravatar.com/avatar/$hash?s=256";
}
public function setGravatarAttribute($gravatar){
if(is_object($gravatar) && $gravatar->isValid()){
$image = Image::make($gravatar)->fit(256, 256);
Storage::disk('local')->put('public/avatars/'.$this->id . '.' . $gravatar->getClientOriginalExtension(), $image->response());
$this->attributes['gravatar'] = $this->id;
}
}
在我的 Blade 文件中:
<img id="avatar" src="{{ $user->gravatar }}" alt="your image" width="256" height="256"/>
mutator 工作得很好:图像存储在 storage/app/public/avatars
目录中。问题是访问器:如果我在 return 之前使用 dd($image);
我可以看到数据,但它没有显示在 html 页面
您正在尝试像字符串一样回显 Response facade,但是您只需要 return 文件的图像路径。
可以使用Storage Facade上的url函数获取图片路径:
if($gravatar){
$image = Storage::disk('local')->url('public/avatars/'.$gravatar.'.jpg');
return $image;
}
因为您使用的是 src 的值:
src="{{ $user->gravatar }}"
https://laravel.com/docs/5.4/filesystem#file-urls
编辑
来自文档:
Remember, if you are using the local driver, all files that should be
publicly accessible should be placed in the storage/app/public
directory. Furthermore, you should create a symbolic link at
public/storage which points to the storage/app/public directory.
完成此操作后,您的 returned url 应该会显示您的图像。
我正在尝试使用 mutator 来存储和检索用户 gravatar。
在我的用户模型中我有:
public function getGravatarAttribute($gravatar){
if($gravatar){
$image = Storage::disk('local')->get('public/avatars/'.$gravatar.'.jpg');
return new Response($image, 200);
}
$hash = md5(strtolower(trim($this->attributes['email'])));
return "http://www.gravatar.com/avatar/$hash?s=256";
}
public function setGravatarAttribute($gravatar){
if(is_object($gravatar) && $gravatar->isValid()){
$image = Image::make($gravatar)->fit(256, 256);
Storage::disk('local')->put('public/avatars/'.$this->id . '.' . $gravatar->getClientOriginalExtension(), $image->response());
$this->attributes['gravatar'] = $this->id;
}
}
在我的 Blade 文件中:
<img id="avatar" src="{{ $user->gravatar }}" alt="your image" width="256" height="256"/>
mutator 工作得很好:图像存储在 storage/app/public/avatars
目录中。问题是访问器:如果我在 return 之前使用 dd($image);
我可以看到数据,但它没有显示在 html 页面
您正在尝试像字符串一样回显 Response facade,但是您只需要 return 文件的图像路径。
可以使用Storage Facade上的url函数获取图片路径:
if($gravatar){
$image = Storage::disk('local')->url('public/avatars/'.$gravatar.'.jpg');
return $image;
}
因为您使用的是 src 的值:
src="{{ $user->gravatar }}"
https://laravel.com/docs/5.4/filesystem#file-urls
编辑
来自文档:
Remember, if you are using the local driver, all files that should be publicly accessible should be placed in the storage/app/public directory. Furthermore, you should create a symbolic link at public/storage which points to the storage/app/public directory.
完成此操作后,您的 returned url 应该会显示您的图像。