Download a file built in PHP output buffer from AJAX call

ajax, download, jquery, output, php

Solution

The following works, but is highly inneficient as it calls the php.php file twice. Does anybody have any better ideas?

<!DOCTYPE html>

<html lang="en">
    <head>
        <meta charset="utf-8" />
        <script type="text/javascript" language="javascript" src="jquery.js"></script>
        <script type="text/javascript">
             $("#download").live("click", function() {
                var request = $.ajax({
                    dataType: 'html',
                    url: 'php.php',
                    success: function(response) {
                        window.open('php.php');
                    }
                })
            })
        </script>
    </head>
    <body>
        <h1 id="download">DOWNLOAD</h1>
    </body>
</html>

Is there anyway to cache 'php.php' for just this instance so that it loads instantly under `window.open('php.php')`, but will reload contents when I click `download` next?

Why does `window.open(response)` not work the same?

Problem

I am trying to build a CSV file in PHP, then call the PHP file from an AJAX call, which will then initiate a download of the CSV file upon success of the AJAX call. This works fine if I save a physical copy of the .csv on the server, but I would like to use `php://ouput` so I do not have to worry about physical files clogging up the server. Is it possible to initiate a download from returning `php://output` to AJAX? Here is my code: HTML/jquery: ``` <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <script type="text/javascript" language="javascript" src="jquery.js"></script> <script type="text/javascript"> $("#download").live("click", function() { var request = $.ajax({ dataType: 'html', url: 'php.php', success: function(response) { alert('Finished'); } }) }) </script> </head> <body> <h1 id="download">DOWNLOAD</h1> </body> </html> ``` PHP: ``` <?php header('Content-type: application/vnd.ms-excel'); header('Content-disposition: attachment; filename="test.csv"'); $f = fopen('php://output', 'w'); fwrite($f,'this,is,a,test'); fclose($f); readfile('php://output'); return; ?> ``` I am not sure how to get this to return a File Save dialog from my AJAX call. This has to be simple, but I can't seem to find any examples that combines these two issues.

Original source