oliver
oliver

Reputation: 87

I couldn't pass an img using ajax?

I'm trying to include a logo when adding a new airline, but I don't know how can I pass input with file type to the controller with ajax. I tried to use FormData(). I did not get any error, but the file was not passed to the controller I have looked at some questions similar to my problem, but I can't find a solution.

<form action="javascript:void(0)" id="addEditBookForm" name="addEditBookForm" class="form-horizontal" method="POST" enctype="multipart/form-data">
              <input type="hidden" name="id" id="id">
              <div class="form-group">
                <label for="name" class="col-sm-2 control-label">Name</label>
                <div class="col-sm-12">
                  <input type="text" class="form-control" id="name" name="name" placeholder="Enter Airline Name" value="" maxlength="50" required="">
                </div>
              </div>  
              <div class="form-group">
                <label for="name" class="col-sm-2 control-label">country</label>
                <div class="col-sm-12">
                  <input type="text" class="form-control" id="country" name="country" placeholder="Enter Airline country" value="" maxlength="50" required="">
                </div>
              </div>
              <div class="form-group">
                <label class="col-sm-2 control-label">Logo</label>
                <div class="col-sm-12">
                  <input type="file" class="form-control" id="logo" name="logo" placeholder="Enter Airline Code" value="" required="">
                </div>
              </div>
              <div class="col-sm-offset-2 col-sm-10">
                <button type="submit" class="btn btn-primary" id="btn-save" value="addNewBook">Save changes
                </button>
              </div>
            </form>

ajax:

  $('body').on('click', '#btn-save', function (event) {
      event.preventDefault()
          var id = $("#id").val();
          var name = $("#name").val();
          var country = $("#country").val();
          let logo = new FormData(document.getElementById("addEditBookForm"));
          $("#btn-save").html('Please Wait...');
          $("#btn-save"). attr("disabled", true);
         
        // ajax
       
        $.ajax({
            type:"POST",
            url: "{{ url('admin/add-update-Airlines') }}",
            data: {
              id:id,
              name:name,
              country:country,
              logo:logo,
            },
            contentType: false,
            processData:false,
            cache: false,
            dataType: 'json',
            success: function(res){
             window.location.reload();
            $("#btn-save").html('Submit');
            $("#btn-save"). attr("disabled", false);
            Swal.fire(
            'Good job!',
            'You clicked the button!',
            'success'
            )
           }
        
        });
      
    });

Controller:

 public function store(Request $request)
    {
        

        $newImgName = time() . '-' . $request->name . '.' .$request->logo->extension();
        $request->logo->move(public_path('img'),$newImgName);
        $Airline   =   Airline::updateOrCreate(
                    [
                        'id' => $request->id
                    ],
                    $request->validate([
                        'name' => ['required', 'string', 'max:255'],
                        'country' => ['required', 'string', 'max:255'],
                        'logo' => ['required|mimes:ipg,png,jpeg|max:5048'],            
                    ]),
                   
                    [
                        'name' => $request->name, 
                        'country' => $request->country,
                        'logo' => $newImgName,
                    ]);
    
                 return response()->json(['success' => true]);
    }

Upvotes: 1

Views: 46

Answers (1)

John Lobo
John Lobo

Reputation: 15319

First thing is csrf token not passing to ajax so change form as below.Also updated

<form action="{{ url('admin/add-update-Airlines') }}" id="addEditBookForm" name="addEditBookForm" class="form-horizontal" method="POST" enctype="multipart/form-data">
         @csrf
            <input type="hidden" name="id" id="id">
            <div class="form-group">
                <label for="name" class="col-sm-2 control-label">Name</label>
                <div class="col-sm-12">
                    <input type="text" class="form-control" id="name" name="name" placeholder="Enter Airline Name" value="" maxlength="50" required="">
                </div>
            </div>
            <div class="form-group">
                <label for="name" class="col-sm-2 control-label">country</label>
                <div class="col-sm-12">
                    <input type="text" class="form-control" id="country" name="country" placeholder="Enter Airline country" value="" maxlength="50" required="">
                </div>
            </div>
            <div class="form-group">
                <label class="col-sm-2 control-label">Logo</label>
                <div class="col-sm-12">
                    <input type="file" class="form-control" id="logo" name="logo" placeholder="Enter Airline Code" value="" required="">
                </div>
            </div>
            <div class="col-sm-offset-2 col-sm-10">
                <button type="submit" class="btn btn-primary" id="btn-save" value="addNewBook">Save changes
                </button>
            </div>
        </form>

Then in ajax I have simplified for testing so you can modify according to your need

$(document).on('click', '#btn-save', function(e) {
            e.preventDefault()
            var url = $("#applicationForm").attr('action');
            let myForm = document.getElementById('addEditBookForm');
            let formData = new FormData(myForm);
            $.ajax({
                type:"POST",
                url:url,
                data: formData,
                contentType: false,
                processData:false,
                cache: false,
                dataType: 'json',
                success: function(res){

                }

            });

        });

Validation

public function store(Request $request)
{
        
   $request->validate([
            'name' => ['required', 'string', 'max:255'],
            'country' => ['required', 'string', 'max:255'],
            'logo' => ['required','mimes:ipg,png,jpeg','max:5048'],
        ]);
}

Upvotes: 1

Related Questions