2

I want to upload (and update) an image via Laravel.

I want an existing image name in my database to be replaced by a new one.

So I have this in my controller:

public function UpdatePic()
    {
        $rules = array(
            'image' => 'required',
            );

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

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

            //define the new random generated string for imagename
            $imagename = str_random(40) . '.' . Input::file('image')->getClientOriginalName();
            //store
            $userimg            = UserImage::find(1);
            $userimg->img       = $imagename;
            $userimg->save();

            //save the image
            $destinationPath = 'public/img/user_img';

            if (Input::hasFile('img'))
            {
                $file = Input::file('img');
                $file->move('public/img/user_img', $imagename);
            }
            //redirect
            Session::flash('success', 'Uw afbeelding is succesvol veranderd!');
            return Redirect::to('admin/user#tab_2-2');

        }
    }

The problem is, When I Got this I'm getting this error:

Creating default object from empty value

I have a post route wich one looks like this:

Route::post('updateuserpic', 'UserController@UpdatePic');

So my view looks like this:

{{ Form::open(array('url' => 'admin/updateuserpic', 'files' => true)) }}
                                                    <div class="form-group">
                                                        <div class="fileinput fileinput-new" data-provides="fileinput">
                                                            <div class="fileinput-new thumbnail" style="width: 200px; height: 150px;">
                                                                <img src="http://www.placehold.it/200x150/EFEFEF/AAAAAA&amp;text=Geen+afbeelding" alt=""/>
                                                            </div>
                                                            <div class="fileinput-preview fileinput-exists thumbnail" style="max-width: 200px; max-height: 150px;">
                                                            </div>
                                                            <div>
                                                                <span class="btn default btn-file">
                                                                    <span class="fileinput-new">
                                                                         Selecteer een afbeelding
                                                                    </span>
                                                                    <span class="fileinput-exists">
                                                                         Verander
                                                                    </span>
                                                                    {{ Form::file('image') }}
                                                                </span>
                                                                <a href="#" class="btn red fileinput-exists" data-dismiss="fileinput">
                                                                     Verwijder
                                                                </a>
                                                            </div>
                                                        </div>
                                                        <div class="clearfix margin-top-10">
                                                            <span class="label label-danger">
                                                                 waarschuwing!
                                                            </span>
                                                            <span>
                                                                 Dit is enkel ondersteund in de laatste versies van Firefox, Chrome, Opera, Safari and Internet Explorer 10!
                                                            </span>
                                                        </div>
                                                    </div>
                                                    <div class="margin-top-10">

                                                        {{ Form::submit('Opslaan', array('class' => 'btn green')) }}

                                                        <a href="{{ Config::get('app.url') }}/admin/user#tab_2-2" class="btn default">
                                                             Annuleer
                                                        </a>
                                                    </div>
                                                {{ Form::close() }}

My Class only has this stuff:

<?php

class UserImage extends Eloquent{

    protected $table = 'user_image';

    public $timestamps = false;

}

I think the image disappears because I'm using that route, but I don't know how to fix it... It doesn't store the image in the folder and it doesn't store the random name in the database..

Thanks people!

Kindest regards,

Robin

3 Answers 3

4

try:

validator::make(Input::file('image'), $rules);

and change the Input from img to image:

        if (Input::hasFile('image'))
        {
            $file = Input::file('image');
            $file->move('public/img/user_img', $imagename);
        }

also to edit the data in the databse, do:

 UserImage::find(1)->update(['img' => $imagename]); 

no need to open a object

also your route should be

Route::post('admin/updateuserpic', 'UserController@UpdatePic');

in your blade:

{{ Form::open(array('url' => 'admin/updateuserpic','method' => 'post' ,'files' => true)) }}

Update for comment

$file = array('image' => Input::file('image');
validator::make($file , $rules);

TBH, i think your code shouldn't be so complected. your Routes are fine, try changing your controller to:

<?php

 public function UpdatePic(){

//first, I'll just do the file validation
$validator =  Validator::make(array( 'image' => Input::file('image')), 
                                array('image' => 'required|image'));


if($validator->fails()){

        //return error code
        Session::flash('error_message', 'Fout:' . $validator->errors());
        return Redirect::to('admin/user#tab_2-2')->withErrors($validator);

    }else{

        //update the image name
        $imageName = str_random(40) . '.' . Input::file('image')->getClientOrignalName();

        //store
        UserImage::find(1)->update(['img' => $imageName]);

        //now move that image to the new location
        $file = Input::file('image');
        $file->move('public/img/user_img/', $imageName);

        //now we have done, lets redirect back
        Session::flash('success', 'Uw afbeelding is succesvol veranderd!');
        return Redirect::to('admin/user#tab_2-2');

            }
 }

?>
Sign up to request clarification or add additional context in comments.

8 Comments

The error I get now is this one: Argument 1 passed to Illuminate\Validation\Factory::make() must be of the type array, object given, called in C:\xampp\htdocs\RPR\system\vendor\laravel\framework\src\Illuminate\Support\Facades\Facade.php on line 211 and defined
I'll try it out tomorrow. If it works, I'll approve the answer!
I tried the code, but now I have another error Call to a member function update() on null
that should not be spat back, unless there is error in code somewhere else.
I use anonter url to post the image? So my controller gos from the URL http://192.168.0.233/RPR/admin/user to http://192.168.0.233/RPR/admin/updateuserpic I don't know if that is the problem.
|
0

The solotion I found with some help of other people wherefor thanks!

Controller:

public function UpdatePic(){

//first, I'll just do the file validation
$validator =  Validator::make(array( 'image' => Input::file('image')), 
                                array('image' => 'required|image'));


if($validator->fails()){

        //return error code
        Session::flash('error_message', 'Fout:' . $validator->errors());
        return Redirect::to('admin/user#tab_2-2')->withErrors($validator);

    }else{

        //update the image name
        $imageName = str_random(40) . '.' . Input::file('image')->getClientOriginalName();


        //store
        UserImage::where('uid', '=', Auth::user()->id)->update(['img' => $imageName]);

        //now move that image to the new location
        $file = Input::file('image');
        $file->move('public/img/user_img/', $imageName);

        //now we have done, lets redirect back
        Session::flash('success', 'Uw afbeelding is succesvol veranderd!');
        return Redirect::to('admin/user#tab_2-2');

            }
 }

The view is just an normal input.

Hope this can help other people!

Special thanks to Ashley Wrench

Comments

0

I used raw PHP for the job

$source = $data['Poster']; /* URL of remote image */

$dest = "posters/".$data['Year']; /* Path */
if (!file_exists($dest)) {
    mkdir($dest, 0777, true); /* Create directory */
}
$dest .= "/".$data['imdbID'].".jpg"; /* Complete file name */

/* Copy the file */
copy($source, $dest);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.