Загрузите файл, созданный в выходном буфере PHP, из вызова AJAX

Я пытаюсь создать CSV-файл в PHP, а затем вызвать PHP-файл из AJAX-вызова, который затем начнет загрузку файла CSV после успешного вызова AJAX. Это отлично работает, если я сохраняю физическую копию CSV на сервере, но я бы хотел использовать php://ouput поэтому мне не нужно беспокоиться о том, что физические файлы засоряют сервер. Возможно ли инициировать загрузку из возвращаемого php://output в AJAX? Вот мой код:

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; ?> 

Я не уверен, как получить это, чтобы вернуть диалог сохранения файла из моего вызова AJAX.

Это должно быть просто, но я не могу найти примеров, которые бы сочетали эти два вопроса.

Следующее работает, но очень маловероятно, поскольку он дважды вызывает файл php.php. У кого-нибудь есть лучшие идеи?

 <!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> 

Нужно ли кэшировать «php.php» только для этого экземпляра, чтобы он мгновенно window.open('php.php') под window.open('php.php') , но перезагружает содержимое, когда я нажимаю кнопку « download ?

Почему window.open(response) не работает одинаково?

Вы можете сделать это, создав и отправив форму через jquery (страница не перезагружается):

 $(document).on('click', '#download', function () { var form = $(document.createElement('form')); form.attr('action', 'php.php'); form.attr('method', 'GET'); form.appendTo(document.body); form.submit(); form.remove(); }); 

Также вы можете передать параметры сообщения, если это необходимо:

 $(document).on('click', '#download', function () { var form = $(document.createElement('form')); form.attr('action', 'php.php'); form.attr('method', 'POST'); var input = $('<input>').attr('type', 'hidden').attr('name', 'x').val('x value'); form.append(input); form.appendTo(document.body); form.submit(); form.remove(); }); 

Чтобы разрешить загрузку файла, вы можете просто вызвать код ниже (например, на кнопке onclick):

 window.open(<file-url>); 

Надеюсь это поможет.