Я пытаюсь создать 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>);
Надеюсь это поможет.