Загрузите файл с помощью ajax-вызова

Я использую PHPExcel, чтобы прочитать шаблон excel, заполнить данные и попросить пользователя загрузить файл.

generate_excel.php

$objPHPExcel = PHPExcel_IOFactory::load("./template.xlsx"); //populate data ... header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="01simple.xlsx"'); header('Cache-Control: max-age=0'); $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter->save('php://output'); 

Когда я открываю файл generate_excel.php непосредственно из браузера, загружается файл результатов. Но если я сделаю ajax-вызов для generate_excel.php, я не получаю приглашение загрузки. Используя инструменты разработчика Chrome, я вижу на вкладке «Сеть», что вызов ajax был успешно завершен, и в данных ответа видна куча случайных символов. Я предполагаю, что это объект excel.

Кто-нибудь знает, как я могу достичь функции excel для загрузки с помощью ajax? Я не хочу обновлять страницу. Когда пользователь нажимает кнопку «Экспорт», должен быть вызов ajax в php-файл и запрашивать загрузку пользователя.

Благодаря!

Я искал способы передать данные JSON с помощью ajax для PHP и вернуть файл excel (MySQL и PHPExcel) для сохранения пользователя. Я оглянулся и собрал несколько штук, надеюсь, что это может помочь кому-то:

JQuery:

 $("#exportBotton").on("click",function(event) { event.preventDefault(); // create json object; str_json = JSON.stringify({"key01":val01, "key02":val02, "key03":val03}); $.ajax({ type: "post", data: str_json, url: "../../includes/dbSelect_agentFormExport.php", dataType: "json", success: function(output){ // output returned value from PHP t document.location.href =(output.url); } }); }); 

PHP:

  $str_json = file_get_contents('php://input'); $objPHPExcel = new PHPExcel(); // here i populated objPHPExcel with mysql query result..... function saveExcelToLocalFile($objWriter){ // make sure you have permission to write to directory $filePath = '../tmp/saved_File.xlsx'; $objWriter->save($filePath); return $filePath; } $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); $response = array( 'success' => true, 'url' => saveExcelToLocalFile($objWriter) ); echo json_encode($response); exit(); 

Не все должно быть сделано с AJAX. Иногда простой старый HTML больше подходит для работы. Думаю, у вашей кнопки есть тег? Почему бы вам не сделать что-то подобное?

 <a href="generate_excel.php" target="_blank">Export to Excel</a> 

в вашем HTML? Обратите внимание на target="_blank" . Он должен убедиться, что ваша страница не перезагружена.

Для input вы можете использовать конструкцию

 <form action="generate_excel.php" target="_blank"><input type="button">...whatever</form> 

Я не думаю, что вы можете скачать что-либо по вызову ajax. Вместо того, чтобы вы могли генерировать и сохранять excel на сервере (временно) и показывать ссылку для загрузки пользователю.

Нашел способ сделать это, хотя я не уверен, что это идеальный подход.

Я добавил скрытый iframe на странице. Когда вызов ajax возвращается, он возвращает URL-адрес созданных данных. Я использовал javascript для перенаправления iframe на этот URL-адрес, который автоматически запускает действие загрузки.