错误图像上传和获取,方法App \ Image :: __ toString()不得抛出异常,捕获Illuminate \ Database \ Eloquent \ JsonEncodingException

时间:2017-05-06 19:13:42

标签: database laravel eloquent filesystems

我正在上传正在上传并移至存储/应用/上传/图片文件夹的用户个人资料图片,但是当我尝试显示该图片时,会出现以下错误。

Method App\Image::__toString() must not throw an exception, caught Illuminate\Database\Eloquent\JsonEncodingException

这是我的控制器功能,用于显示

public function userProfile() {   
     $image = Image::all();
    return view('frontend.layouts.Profile',compact('image'));
}

我在显示图像的视图

@foreach($image as $images)
          <img style="width:210px ; height: 230px " src="/storage/app/upload/images/{{$images->image}}" >

@endforeach

1 个答案:

答案 0 :(得分:0)

有三种方法可以为用户提供图像:

<强> 1。作为公共资产 这里的图像可供所有人使用。例如,所有人都可以访问您的网站徽标或着陆页图像。因此,所有人都可以轻松访问图像的网址。这些类型的文件将直接发送到public/img/文件夹。

<强> 2。仅作为受保护的图像,仅在请求特定网址时可用 在这里,特定人员将访问用户特定图像。想想你的会员&#39;您希望仅向会员本人或某些特定人士提供的个人照片。在这种情况下,您可以将图像存储在storage/app/public中,并使用artisan命令php artisan storage:link创建符号链接。您可以在此here上阅读更多内容。假设您使用str_random()使用随机名称存储文件,然后使用asset()帮助程序为您的图像生成网址:echo asset('storage/X3jf5j5b2j3n.jpg');鉴于文件名是随机的,很难访问除了那些使用asset()帮助器生成url的人之外,所有人都使用此图像。

第3。作为使用干预库提供的受保护图像 在这种情况下,您首先要检查用户是否已登录,然后使用Intervention通过另一个受保护的路由动态加载图像。因此,在您的Web路由中,您将首先获得使用auth中间件的用户授权:

Route::group(['middleware' => 'auth'], function () {
    Route::get('user', 'UserController@userProfile');
    Route::get('images/{image}', 'UserController@serveImage'); // this route serves the image only if user is logged in
});

然后,一旦您使用composer安装了Intervention库,我们的UserController将如下所示:

use Intervention;

class UserController extends Controller
{ 
    public function userProfile()
    { 
        $images = Image::all();
        return view('frontend.layouts.Profile', compact('images'));
    }

    public function serveImage($image)
    {  
        $filename = storage_path('app/images/'.$image);
        return Intervention::make($filename)->response();
    }
}

您可以看到图像现在是从storage文件夹而不是public文件夹提供的。因此,仅当先前为其定义的路由被授权时,才调用此方法serveImage()。干预然后发挥其魔力来阅读图像并将其作为http响应发送。

您的视图会改变一点,以适应我们定义的名为images的新路由终点。我假设您通过名为filename的字段将数据的文件名存储在db中:

@foreach($images as $image)
    <img style="width:210px ; height: 230px " src="{{ url('/images/'.$image->filename) }}" >
@endforeach

注意:请记住,提供图像的首选方法是使用方法2,因为它更快。如果您真的不希望任何人使用网址偶然发现文件,您可以谨慎使用方法3。