Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

blackpearl's avatar

Display image show method

Hello, im new user of laravel community and i have a little problem. I have method which create a new article and save img in directory.

public function doCreate()
    {
        $rules = array(
            'title' => 'required',
            'body' => 'required',
        );

        $validator = Validator::make(Input::all(), $rules);
        if($validator->passes()){

        $articles = new Article();
        $articles->title = Input::get('title');
        $articles->body = Input::get('body');
        
        if($articles->save()) {
            $path = 'upload/'.$articles->id.'/';
            Input::file('image')->move($path, Input::file('image')->getClientOriginalName());

            $articles->image = $path. Input::file('image')->getClientOriginalName();
            $articles->save();
        }
        return redirect('/');
     }else{
        return Redirect::to('articles/create')->withErrors($validator)->withInput(Input::all());
        }
    }

but in my show method article image and other image are not displayed. Can someone help me?

public function show($id)
    {
        $article = Article::findOrFail($id);

        $slider_article = Article::findOrFail($id);

        return view('articles.show', compact('article','slider_article'));
    }

My routes

Route::get('articles/create', 'ArticlesController@create');
Route::post('articles/create', 'ArticlesController@doCreate');
Route::get('articles/{id}', 'ArticlesController@show');
0 likes
7 replies
mehany's avatar

@blackpearl replace

$path. Input::file('image')->getClientOriginalName();

to this when saving the image

 public_path(). $path. Input::file('image')->getClientOriginalName();

when retrieving it instead, use

$path. Input::file('image')->getClientOriginalName();

which means

if($articles->save()) {
        $pathToShow = 'upload/'.$articles->id.'/';
        $pathToSave = public_path(). $path. Input::file('image')->getClientOriginalName();
        Input::file('image')->move($pathToSave , Input::file('image')->getClientOriginalName());

        $articles->image = $pathToShow . Input::file('image')->getClientOriginalName();
        $articles->save();
    }

source... Hope that helped

blackpearl's avatar

When i replaced the code, image are not saved in directory and are not displayed.

In my code image are displayed in this method

public function index()
    {
        $articles = Article::take(4)->orderBy('created_at', 'DESC')->get();

        $slider_articles = Article::take(2)->orderBy('created_at', 'DESC')->get();
        return view('articles.index', compact('articles','slider_articles'));
    }

but only in show method are not displayed

public function show($id)
    {
        $article = Article::findOrFail($id);

        $slider_article = Article::findOrFail($id);

        return view('articles.show', compact('article','slider_article'));
    }
mehany's avatar

are you getting any errors? also I don't use getClientOriginalName() so you may also need getClientOriginalExtension()

mehany's avatar

I am confused, what is the difference between

    $article = Article::findOrFail($id);

    $slider_article = Article::findOrFail($id);

Can you post your blade code for index.blade.php and show.blade.php

blackpearl's avatar

It's my index show.blade view

@extends('layout')
@section('content')


<div class="container">
        <h2>{{ $article->title }}</h2>
        <hr/>
        <img src="{{$article->image }}"alt="">
        <p>{{ $article->body }}</h2>
</div>


@stop

and index.blade.php

<div class="container-fluid">
            <div class="col-md-12 slider-out">
                <ul class="slider">
                    @foreach( $slider_articles as $slider_article)
                        <li>
                            <h1>
                                <a href='{{ url("/articles", $slider_article->id)}}'>{{ $slider_article->title}}</a>
                            </h1>
                            <p>
                                <a href='{{ url("/articles", $slider_article->id)}}'>{{ substr($slider_article->body, 0, 60) }}...</a>
                            </p>
                            <img src="{{ $slider_article->image }}" alt="logo">
                        </li>
                    @endforeach
                </ul>
            </div>
    </div>
    <div class="container">
        @foreach( $articles as $article )
                <div class="col-xs-12 col-sm-6 col-md-3 header-center">
                  <div class="thumbnail">
                            <img src="{{$article->image }}"alt="">
                                <div class="caption">
                                    <h3>
                                        <a href='{{ url("/articles", $article->id)}}'>{{ $article->title}}</a>
                                    </h3>
                                <p>{{ substr($article->body, 0, 60) }}...</p>
                                </div>
                                {{-- <p><a href='{{ url("/articles", $article->id)}}' class="button-news">Zobacz więcej</a></p> --}}
                                
                  </div>
                </div>
        @endforeach
              
    </div>
pmall's avatar
pmall
Best Answer
Level 56

It doesn't work for show because you put a non relative path for your image path. And show has an additional "directory" in the url (the id) compared to the index.

When getting the path for something from public folder, use the asset helper.

<img src="{{ asset($article->image) }}" alt="">

Also, the convention for this :

Route::post('articles/create', 'ArticlesController@doCreate');

Is this :

Route::post('articles', 'ArticlesController@store');
1 like

Please or to participate in this conversation.