Robin
Robin

Reputation: 1587

Posting content into the database with an image using Laravel

I'm trying to post some stuff into the database using laravel, but It seems not to work...

This is what I get:

The HTML:

{{ Form::open(array('role' => 'form')) }}
                            <div class="form-body">
                                <div class="form-group">
                                    <label>Titel</label>
                                    <input type="text" class="form-control" name="title" placeholder="Titel komt hier">
                                </div>

                                <div class="form-group">
                                    <label>Textarea</label>
                                    <textarea class="form-control" name="message" rows="5" placeholder="Uw bericht..."></textarea>
                                </div>

                                <div class="form-group">
                                    <label for="exampleInputFile1">Nieuws afbeelding</label>
                                    <input type="file" name="img">
                                </div>

                            </div>

                            <div class="form-actions">
                                <input type="submit" class="btn green" value="Oplsaan" />
                            </div>

                        {{ Form::close() }}

                        @if ($errors->any())
                            <ul>
                                {{ implode('', $errors->all('<li class="error">:message</li>')) }}
                            </ul>
                        @endif

That displays all well....

Exept when I try to 'post' the news, because that is what I try to do, it just refreses the page. The URL to that page is mydomain.com/admin/news/write

My router looks like this:

Route::resource('admin/news/write', 'AdminController@create');

First it was authenticated in a group:

Route::group(array('before' => 'auth'), function()
    {
            Route::resource('admin', 'AdminController');
            Route::resource('admin/news/write', 'AdminController@create');
    });

This all works, but when I change the Route::resource('admin/news/write', 'AdminController@create'); to Route::post('admin/news/write', 'AdminController@create'); I get an error, that I can't see...

Good, now my controller:

public function store()
{
    $rules = array(
        'title' => 'required',
        'message'   => 'required',
    );  

    $validator = Validator::make(Input::all(), $rules);

    if ($validator->passes())
    {
        if (Input::only('title', 'message'))
        {

            return Redirect::to('admin/news/write')->with('message', 'Het nieuws werd gemaakt!');

        }

    }
    else
    {
        return Redirect::to('admin/news/write')->with('message', "Er ging iets mis: ")->withErrors($validator);
    }

}

The problem is, I don't know how I can store an image to

/public/pictures/news

And then store the full file name into the database, if someone could help me out... I need a response quick, beacause I have a deadline... :{

Kindest regards

Upvotes: 1

Views: 1123

Answers (2)

Robin
Robin

Reputation: 1587

I fixed the issue.

My controller:

    <?php
class AdminNewsController extends \BaseController {

    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index()
    {
        return View::make('admin.news.create');
    }


    /**
     * Show the form for creating a new resource.
     *
     * @return Response
     */
    public function create()
    {
        return View::make('admin.news.create');
    }


    /**
     * Store a newly created resource in storage.
     *
     * @return Response
     */
    public function store()
    {
        $rules = array(
            'title'         => 'required',
            'message'       => 'required',
            'publish'       => 'required'
            );
        $validator = Validator::make(Input::all(), $rules);

        //process the storage
        if ($validator->fails())
        {
            Session::flash('error_message', 'Fout:' . $validator->errors());
            return Redirect::to('admin/news/create')->withErrors($validator);
        }else{

            //store
            $news                   = new News;
            $news->title            = Input::get('title');
            $news->message          = Input::get('message');
            $news->img_url          = Input::file('img')->getClientOriginalName();
            $news->posted_by        = Auth::user()->username;
            $news->published_at     = time();
            $news->published        = Input::get('publish');
            $news->save();

            //save the image
            $destinationPath = 'public/pictures/news';

            if (Input::hasFile('img'))
{
    $file = Input::file('img');
    $file->move('public/pictures/news', $file->getClientOriginalName());
}
            //redirect
            Session::flash('success', 'Nieuws succesvol aangemaakt!');
            return Redirect::to('admin/news/create');

        }
    }


    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return Response
     */
    public function show($id)
    {
        //
    }


    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return Response
     */
    public function edit($id)
    {
        //
    }


    /**
     * Update the specified resource in storage.
     *
     * @param  int  $id
     * @return Response
     */
    public function update($id)
    {
        //
    }


    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return Response
     */
    public function destroy($id)
    {
        //
    }


}

My create.blade.php

<div class="portlet-body form">
                    {{ Form::open(['method'=>'POST', 'role' => 'form', 'files' => true]) }}
                            <div class="form-body">
                                <div class="form-group">
                                    <label>Titel</label>
                                    <input type="text" class="form-control" name="title" placeholder="Titel komt hier">
                                </div>

                                <div class="form-group">
                                    <label>Textarea</label>
                                    <textarea class="form-control" name="message" rows="5" placeholder="Uw bericht..."></textarea>
                                </div>

                                <div class="form-group">
                                    <label>Nieuws afbeelding</label>
                                    {{ Form::file('img') }}
                                </div>

                                <div class="form-group">
                                    <label>Bericht publiceren?</label>
                                    <div class="radio-list">

                                        <label class="radio-inline">
                                        <span>
                                        {{ Form::radio('publish', '1') }}
                                        </span>
                                        <b style="color:green">Publiceren</b>
                                        </label>

                                        <label class="radio-inline">
                                        <span>
                                        {{ Form::radio('publish', '0', true) }}
                                        </span>
                                        <b style="color:red">Niet publiceren</b>
                                        </label>


                                    </div>
                                </div>

                            </div>

                            <div class="form-actions">
                                <input type="submit" class="btn green" value="Oplsaan" />
                            </div>

                        {{ Form::close() }}
                    </div>

Then It all work!

Thanks to Matt Barber for the help!

Upvotes: 0

Mattamorphic
Mattamorphic

Reputation: 90

First you need to tell your form using the laravel helper that this is going to be uploading a file...

Form::open(['method'=>'POST', 'role' => 'form', 'files' => true])

In your controller you want to get the file from the input

$imgFile = Input::file('img');

Now to move the file from the temporary location it's been uploaded, to a more permanent location call the following (where $filename is what you want to call the uploaded file)...

$dir = '../storage/app/upload/';
$imgFile->move($dir.$filename);

The path for the root of the app from here is ../ (one up from public) so.. ../storage/app/upload/ would be a great location to use for uploaded files.

You can then just write:

$dir.$filename;

back to the database - job done :)

Edit :: -- Your Controller --

Your controller for parsing this is based on resources...

So your route will be:

Route::group(array('before' => 'auth'), function()
{
    Route::resource('admin', 'AdminController');
}

Your controller itself will have a structure such as (remembering this: http://laravel.com/docs/4.2/controllers#restful-resource-controllers):

class AdminController extends BaseController {
    public function index(){...}
    public function create(){...}
    public function 
    //The store() method is an action handled by the resource controller
    //Here we're using it to handle the post action from the current URL
    public function store()
    {
       $imgFile = Input::file('img');
       //processing code here....
    }
    public function show(){...}
    public function edit(){...}
    public function update(){...}
    public function destroy(){...}   
}

Upvotes: 3

Related Questions