РЕДАКТИРОВАТЬ Я только что попробовал это с файлом 10 МБ, и кажется, что val () слишком медленно для вставки данных. Hurrumph.
Хорошо, так что я дал этому еще один шанс. Это может быть или не быть полностью безумным! Идея состоит в том, чтобы сделать AJAX-запрос на создание данных, а затем использовать обратный вызов для вставки данных в скрытую форму на текущей странице, которая выполняет действие третьей страницы «загрузки»; после вставки форма автоматически отправляется, страница загрузки отправляет заголовки и повторяет сообщение POST, и т.д., загрузка.
Все время на исходной странице вы видите, что файл готовится, и когда он заканчивается, индикатор обновляется.
ПРИМЕЧАНИЕ: этот тестовый код не тестировался всесторонне и не имеет реальных проверок безопасности (или вообще никаких). Я протестировал его с CSV-файлом объемом 1,5 МБ, который лежал у меня на месте, и он был достаточно быстрым.
Index.html
<a id="downloadlink" href="#">Click Me</a>
<div id="wait"></div>
<form id="hiddenform" method="POST" action="download.php">
<input type="hidden" id="filedata" name="data" value="">
</form>
test.js
$(document).ready(function(){
$("#downloadlink").click(function(){ // click the link to download
lock(); // start indicator
$.get("create.php",function(filedata){ // AJAX call returns with CSV file data
$("#filedata").val(filedata); // insert into the hidden form
unlock(); // update indicator
$("#hiddenform").submit(); // submit the form data to the download page
});
});
function lock(){
$("#wait").text("Creating File...");
}
function unlock(){
$("#wait").text("Done");
}
});
create.php
<?php
//create $data
print $data;
?>
download.php
<?php
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: text/x-csv");
header("Content-Disposition: attachment;filename=\"search_results.csv\"");
if($_POST['data']){
print $_POST['data'];
}
?>