Upload file Using Ajax With Progress Bar in Laravel

View Code

<!-- Css code -->

<style>
#uploadForm {border-top:#F0F0F0 2px solid;background:#FAF8F8;padding:10px;}
#uploadForm label {margin:2px; font-size:1em; font-weight:bold;}
.demoInputBox{padding:5px; border:#F0F0F0 1px solid; border-radius:4px; background-color:#FFF;}
#progress-bar {background-color: #12CC1A;height:20px;color: #FFFFFF;width:0%;-webkit-transition: width .3s;-moz-transition: width .3s;transition: width .3s;}
.btnSubmit{background-color:#09f;border:0;padding:10px 40px;color:#FFF;border:#F0F0F0 1px solid; border-radius:4px;}
#progress-div {border:#0FA015 1px solid;padding: 5px 0px;margin:30px 0px;border-radius:4px;text-align:center;}
#targetLayer{width:100%;text-align:center;}
</style>

<!-- Form Code -->

<form method="post" id="upload_form" enctype="multipart/form-data">
  {{ csrf_field() }}
                 
     <input type="file" class="form-control" name="picture" >
                     
     <div id="progress-div" style="display: none;">
        <div id="progress-bar"></div>
     </div>
     <div id="targetLayer"></div>

  <input type="submit" name="upload" id="upload" value="submit"> 
</form>

<!-- Javascript Code -->

<script src="https://code.jquery.com/jquery-2.1.1.min.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.form/4.3.0/jquery.form.min.js" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

<script>
 $(document).ready(function(){
      $('#upload_form').on('submit', function(event){
         event.preventDefault();
         $("#progress-div").show();
         $("#progress-bar").width('0%');

         var data = new FormData(this);

         $.ajax({
            xhr: function() {
                 var xhr = new window.XMLHttpRequest();
                 xhr.upload.addEventListener("progress", function(evt) {
                     if (evt.lengthComputable) {
                         var percentasect = (evt.loaded / evt.total) * 100;
                         var percentComplete = Math.round(percentasect);
                        $("#progress-bar").width(percentComplete + '%');
                        $("#progress-bar").html('<div id="progress-status">' + percentComplete +' %</div>')
                     }
                }, false);
                return xhr;
             },
            url:'{{url("/store-api")}}',
            method:"POST",
            data:data,
            dataType:'JSON',
            contentType: false,
            cache: false,
            processData: false,
            target:   '#targetLayer', 
               success:function (data){
                  window.location.assign(data.url);
               },
         });
      });
   });
</script>

Controller Code

function store_api(Request $request)
{
    if(isset($request->picture) && !empty($request->picture)) 
    {
        $files = $request->picture;
        $name = $files->getClientOriginalName();  
        $files->move('public/uploads',$name);  
        $image_data['picture'] = $name;  
        ModelName::create($image_data); 
    }

    echo json_encode(['status'=>'Upload Successfull.','url'=>url('/')]);
}

Route Code

Route::post('/store-api', 'Controller@store_api');
or
Route::post('/store-api', [Controller::class, 'store_api']);

0 Comments

Leave a Reply

You must be logged in to post a comment.