If you want to show the user a graph of the progress of the download process, you must perform the download in the xmlhttprequest file. One of the problems is that if your files are large, they will be saved in the browser memory before the browser writes them to disk (when using regular files for downloading, files are saved directly to disk, which saves a lot of memory on large files).
Another important thing - in order for lengthComputable be true - your server must send a Content-Length header with the file size.
Here is the javascript code:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id="a1" data-filename="filename.xml">Click to download</div> <script> $('#a1').click(function() { var that = this; var page_url = 'download.php'; var req = new XMLHttpRequest(); req.open("POST", page_url, true); req.addEventListener("progress", function (evt) { if(evt.lengthComputable) { var percentComplete = evt.loaded / evt.total; console.log(percentComplete); } }, false); req.responseType = "blob"; req.onreadystatechange = function () { if (req.readyState === 4 && req.status === 200) { var filename = $(that).data('filename'); if (typeof window.chrome !== 'undefined') { </script>
And here is an example php code you can use:
<?php $filename = "some-big-file"; $filesize = filesize($filename); header("Content-Transfer-Encoding: Binary"); header("Content-Length:". $filesize); header("Content-Disposition: attachment"); $handle = fopen($filename, "rb"); if (FALSE === $handle) { exit("Failed to open stream to URL"); } while (!feof($handle)) { echo fread($handle, 1024*1024*10); sleep(3); } fclose($handle);
Note that I added sleep to simulate a slow connection for testing on localhost.
You must remove this when creating :)
Dekel source share