title: showing download progress while downloading a file using PHP and jquery
body: <p>I am developing a download manager using PHP and jquery.</p>
  <p>Requested a script that will download a file and also show the download progress.</p>
  <p>I tried the following, but it not works</p>
  <p>Jquery</p>
  <pre><code>function downloadFile(){
      var fileNameDownloading =&quot;somefile.mp3&quot;
      var oReq = new XMLHttpRequest();    
      oReq.addEventListener(&quot;progress&quot;, updateProgress, false);
      var params = &quot;filename=&quot;+fileNameDownloading;   
      oReq.open(&quot;GET&quot;, &quot;scripts/download.php?&quot;+params, true);
      oReq.responseType = &quot;blob&quot;;//blob arraybuffer
  
      function updateProgress (e) {
          console.log(e.loaded/e.total);
      }
      oReq.send();    
  }
  </code></pre>
  <p>PHP</p>
  <pre><code>&lt;?php
  $file = $_GET['filename'];
  $fileSize = get_size($file);
  $packetSize = 262144;//2000
  if($packetSize &gt; $fileSize){
      $packetSize = $fileSize;
  }
  download($file,$packetSize);
  
  
  function download($file,$chunks){
      set_time_limit(0);
      header('Content-Description: File Transfer');
      header('Content-Type: application/octet-stream');
      header('Content-disposition: attachment; filename='.basename($file));
      header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
      header('Expires: 0');
      header('Pragma: public');
      $size = get_size($file);
      header('Content-Length: '.$size);
  
      $i = 0;
      while($i&lt;=$size){
          //Output the chunk
          get_chunk($file,(($i==0)?$i:$i+1),((($i+$chunks)&gt;$size)?$size:$i+$chunks));
          $i = ($i+$chunks);
      }
  
  }
  
  //Callback function for CURLOPT_WRITEFUNCTION, This is what prints the chunk
  function chunk($ch, $str) {
      
      print($str);
      return strlen($str);
  }
  
  //Function to get a range of bytes from the remote file
  function get_chunk($file,$start,$end){
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, $file);
      curl_setopt($ch, CURLOPT_RANGE, $start.'-'.$end);
      curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
      curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'chunk');
      $result = curl_exec($ch);
      curl_close($ch);
  }
  
  //Get total size of file
  function get_size($url){
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch, CURLOPT_HEADER, true);
      curl_setopt($ch, CURLOPT_NOBODY, true);
      curl_exec($ch);
      $size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
      return intval($size);
  }
  ?&gt;
  </code></pre>
  <p>Looking for a suggestion, how we can download a file and also show download progress using PHP and javascript. Thanks</p>