简体   繁体   中英

Image upload not working through ajax Laravel

Having a weird issue and I'm sure it's got something to do with the way my script is grabbing the value of the file input field.

I know the controller function works because I've been able to do it by manually submitting the form without using ajax.

I also know the ajax works in sending and receiving the request because I tested it by modifying it to parse a string back and forth which worked.

Additionally I can see that the script is grabbing the file as when I select a file, it shows the selected file in the console.

In my browser I'm getting a 500 error and in Laravel I'm only getting this:

Symfony\Component\Debug\Exception\FatalThrowableError: Call to a member function getClientOriginalExtension() on string in C:\123\app\Http\Controllers\MyController.php:156

I've tried updating the controller to use Request->logo instead with no success.

View:

<form enctype="multipart/form-data" class="form-horizontal" method="POST" action="{{ url('studio/uploadLogo') }}">
    {{ csrf_field() }}
    <div class="form-group{{ $errors->has('studioname') ? ' has-error' : '' }}">            
                <label for="imageInput" class="col-md-4 control-label">Logo</label>
                <div class="col-md-6">
                    <input data-preview="#preview" name="logo" type="file" id="imageInput">
                    <img id="preview" src="" style="display: none"></img>
                    <input class="form-control" type="submit">
                </div>
            </div>
        </form>

Script:

$('#imageInput').change(function (e) {
    e.preventDefault();
    var logo = $('#imageInput').val();
    console.log(logo);
    $.ajax({
        type: "POST",
        url: '/studio/uploadLogo',
        data: {logo: logo},
        success: function( data ) {
            console.log(data);
        }
    });
}); 

Controller:

public function uploadLogo() {
    $file = Input::file('logo')->getRealPath();
    $photoName = str_random(20) . '.' . Input::file('logo')->getClientOriginalExtension();
    Input::get('logo')->move(public_path('avatars'), $photoName);
    $response = array(
        'status' => 'success',
        'data' => $photoName
    );
    return \Response::json($response);
}

Routes:

 Route::post('/studio/uploadLogo', 'MyController@uploadLogo');
 Route::get('/studio/uploadLogo', 'MyController@uploadLogo');

  You just change a view js script to submit like below $('.form-horizontal').submit(function(event){ event.preventDefault(); $.ajax({ type : 'POST', url : "/studio/uploadLogo", data : new FormData(this), contentType:false, processData:false, }) .done(function(data,status){ //Your codes here }); }); and echo string response from controller like below ---------------- $file=$request->file('logo'); $uploaded_file_path=''; if($file!=null) { $destinationPath = 'uploads'; $uploaded=$file->move($destinationPath,$file->getClientOriginalName()); $uploaded_file_path= $uploaded->getPathName(); $response = array( 'status' => 'success', 'data' => $uploaded_file_path ); }else{ $response = array( 'status' => 'failed', 'data' => $uploaded_file_path ); } echo json_encode($response); ---------------- 

Try this in your controller

public function uploadLogo() {
    $file = Input::file('logo')->getRealPath();
    $photoName = str_random(20) . '.' . Input::file('logo')->getClientOriginalExtension();
    Input::file('logo')->move(public_path('avatars'), $photoName);
    $response = array(
        'status' => 'success',
        'data' => $photoName
    );
    return \Response::json($response);
}

You have given

Input::get('logo')->move(public_path('avatars'), $photoName);

Please change it to

Input::file('logo')->move(public_path('avatars'), $photoName);

and you should submit the form from ajax as like @jalin comment ( https://stackoverflow.com/a/47906201/4049692 )

Hope this should be the issue. Thanks!.

Try adding processData: false, contentType: false in your script code

$('#imageInput').change(function (e) {
e.preventDefault();
var logo = $('#imageInput').val();
var form_data = new FormData();
form_data.append("logo",$("#imageInput")[0].files[0]);
console.log(logo);
$.ajax({
    type: "POST",
    url: '/studio/uploadLogo',
    data: {form_data},
    cache : false,
    processData: false,
    contentType: false
    success: function( data ) {
        console.log(data);
    }
});
}); 

And try getting values in controller like $request->logo

Refer my answer here enter link description here

add data into FormData instance using 'this' and pass it to the data object in the ajax, also add contentType: false, processData: false

let formData = new FormData(this);
 $.ajax({
          type: "POST",
          url: "{{ route('auth.societies.store') }}",
          contentType: false,
          processData: false,
       });

then it will upload the form images

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM