Laravel 5.4+:用于上传图像的Mutator / Accessor

时间:2017-08-15 14:31:44

标签: php laravel-5 model accessor mutators

我正在尝试使用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目录中。问题是访问者:如果我在返回之前使用dd($image);我可以看到数据但是它没有显示在html页面中

1 个答案:

答案 0 :(得分:1)

您尝试像字符串一样回显Response Facade,但是您只需要返回文件的图像路径。

您可以使用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

<强> 修改

来自文档:

  

请记住,如果您使用的是本地驱动程序,那么应该是所有文件   可公开访问的应放在storage / app / public中   目录。此外,您应该在。创建一个符号链接   公共/存储指向存储/应用/公共目录。

完成此操作后,您返回的网址应显示您的图片。