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 应该会显示您的图像。