richardzen
richardzen

Reputation: 13

Laravel how to upload an image to a database and show it in view

So i was making a form that consists of three field, the title, thumbnail, and textarea(with texteditor) and it seems that it upload the image just fine since i notice that there is images that i had uploaded in my /public/image folder after i submit the form, but when i check the database the thumbnail field showed not the name of the file in the /public/image folder like 20190713125534.jpg but

C:\xampp\tmp\phpC18A.tmp

im confused i thought it doesn't upload the image at all, but as i explained earlier it does, so my question is how do i change the value of thumbnail field with the filename and how do i show the image in my view ?

this is my Blogcontroller.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Blog;
use Validator,Redirect,Response,File;

class BlogController extends Controller
{
    public function index()
    {
        $blogs = Blog::get();
        return view('post.post_textarea',[
            'blogs' => $blogs
        ]);
    }

    public function store(Request $request)
    {
        Blog::create([
            'name' => $request->name,
            'message' => $request->message,
            'thumbnail' => $request->thumbnail,
       ]);
       if ($files = $request->file('thumbnail')) {
           $destinationPath = 'public/image/'; // upload path
           $profileImage = date('YmdHis') . "." . $files->getClientOriginalExtension();
           $files->move($destinationPath, $profileImage);
           $insert['thumbnail'] = "$profileImage";
        }
        return redirect()->back();
    }

    public function getFullPost($blog_id) {
    $blogs = Blog::where('id', '=', $blog_id)->get();
    return view('post.read')->with(compact('blogs'));
    }
}

this is my view for the form

<form enctype="multipart/form-data" method="POST">
                        {{csrf_field()}}
                        <div class="form-group">
                            <h4 style="color: black;" >Judul</h4>
                            <br>
                            <input type="text" class="form-control" name="name">
                        </div> 
                        <div class="form-group">
                            <h4 style="color: black;" >Thumbnail</h4>
                            <br>
                            <input type="file" name="thumbnail">
                        </div>                     
                        <div class="form-group">
                            <h4 style="color: black;" >Isi</h4>
                            <br>
                                <textarea class="form-control" name="message" id="" rows="10"></textarea>
                        </div>
                        <div class="form-group">
                            <button class="pull-right site-btn" type="submit" >Upload<img src="../public/asset/img/icons/double-arrow.png" alt="#"/></button>
                        </div>                     
                    </form>

and this is my view to display the data from database

@foreach ($blogs as $blog)
     <div class="blog-item">
          <div class="blog-thumb">
               <img src="asset/img/blog/1.jpg" alt="">  ->this is where i was supposed to fetch the image
          </div>

     <div class="blog-text text-box text-white">                            
           <div class="top-meta">{{ Carbon\Carbon::parse($blog->created_at)->format('d-m-Y')  }} /  di <a href="">Rakitan</a></div>
            <h3>{{ $blog->name }}</h3>
            <p>{!! \Illuminate\Support\Str::words($blog->message, 30, '...') !!}</p>
            <a href="{{ route('post.read', ['blog_id' => $blog->id]) }}" class="read-more">Lanjutkan Baca  <img src="asset/img/icons/double-arrow.png" alt="#"/></a>

           </div>
        </div>
@endforeach

Upvotes: 0

Views: 2427

Answers (2)

afikri
afikri

Reputation: 394

The problem with your code, I think in your store function, you did not save it correctly. Please see my code below to save link of your thumbnail into db.

    <?php
       namespace App\Http\Controllers;
       use Illuminate\Http\Request;
       use App\Http\Requests;
       use App\Http\Controllers\Controller;
       use App\Blog;    

       class BlogController extends Controller{

        //some your function goes here      
        /**
         * Store a newly created resource in storage.
         *
         * @param  \Illuminate\Http\Request  $request
         * @return \Illuminate\Http\Response
         */
          public function store(Request $request)
          {
                $blog = new Blog;
                $blog->name = $request->input('name');              
                $blog->message = $request->input('message');

                $file = $request->file('your_thumbnail');
                //make sure yo have image folder inside your public
                $destination_path = 'image/';
                $profileImage = date("Ymd").".".$file->getClientOriginalName();
                $file->move($destination_path, $profileImage);
                //save the link of thumbnail into myslq database        
                $blog->thumbnail = $destination_path . $profileImage;
                $blog->save();
                return redirect()->back();
           }
    }

Upvotes: 0

sid heart
sid heart

Reputation: 1149

try to add this in controller

$blog = new Blog;
$blog->name = $request->name;
$blog->message = $request->message;
if($request->hasFile('thumbnail')) {

            $file = Input::file('thumbnail');
            //getting timestamp
            $timestamp = str_replace([' ', ':'], '-', Carbon::now()->toDateTimeString());
            $name = $timestamp. '-' .$file->getClientOriginalName();
            $file->move(public_path().'/images/', $name);
            $blog->thumbnail = url('/images/' . $name);

        }
$blog->save();

return back();

than in your view

@foreach ($blogs as $blog)
     <div class="blog-item">
          <div class="blog-thumb">
               <img src="{{ $blog->thumbnail }}" alt="">  ->this is where i was supposed to fetch the image
          </div>

     <div class="blog-text text-box text-white">                            
           <div class="top-meta">{{ Carbon\Carbon::parse($blog->created_at)->format('d-m-Y')  }} /  di <a href="">Rakitan</a></div>
            <h3>{{ $blog->name }}</h3>
            <p>{!! \Illuminate\Support\Str::words($blog->message, 30, '...') !!}</p>
            <a href="{{ route('post.read', ['blog_id' => $blog->id]) }}" class="read-more">Lanjutkan Baca  <img src="asset/img/icons/double-arrow.png" alt="#"/></a>

           </div>
        </div>
@endforeach

Upvotes: 2

Related Questions