здравствуйте! есть два скрипта... в первом форма отправки, во втором формирование на основе данных формы xls файла... хотелось бы если второй скрипт сформировал файл (или не сформировал, не суть) передал в первый ответ и по ответу сделать релоад страницы... в первом просто есть кнопка загрузки файла, а когда файл загружен, то появляется кнопка "сформировать файл" и по клику по ней данные улетают во второй скрипт... хочу, чтобы после получения файла страница возвращалась в исходное состояние, без кнопки "сформировать файл"! файл xls формируется библиотекой PHPExcel... весь скрипт не привожу, он достаточно стандартный... отправка во второй тоже обычная Код (Text): <form METHOD="POST" ACTION="GetInXls.php" /> <input type="hidden" name="variable" value='.$new_file_tmp.'> <input class="left-indent" style="width: 160px; background-color: limegreen" type="submit" value="Сформировать файл"> </form> может просто укажете мне нужное направление, бо гугл что-то мне ничего дельного не выдаёт... заранее спасибо!
Добрый день! Попробуйте сделать так PHP: <? if(isset($_POST["variable"])) { /* Здесь файл xls формируется библиотекой PHPExcel В случае успеха $xlsOK = true, иначе $xlsOK = false; */ $xlsOK = true; //$xlsOK = false; if($xlsOK) $res["status"] = 1; else $res["status"] = 0; header('Content-Type: application/json; charset=utf-8'); echo json_encode($res); exit; } $new_file_tmp = "my_file.tmp"; echo <<<HTML <html> <head> <style> .left-inden{ width: 160px; background-color: limegreen } </style </head> <body> <form method="POST"> <input type="hidden" name="variable" value="$new_file_tmp"> <input id="go" class="left-indent" type="submit" value="Сформировать файл"> </form> <div id="st"></div> </html> <script> form = document.querySelector("form"); st = document.getElementById("st"); go = document.getElementById("go"); form.onsubmit = (event) => { event.preventDefault(); fd = new FormData(form); fetch("?", { method: "POST", body: fd }) .then(response => response.json()) .then((data) => { if(data["status"] == 1) { //В случае успеха переход на другую страницу //window.location.replace("....."); // или //В случае успеха кнопкa "Сформировать файл" удаляется go.style.display="none"; } else { st.innerHTML = "Файл xls не сформирован!" } }) } </script> HTML; Удачи!
спасибо! идея в принципе понятна, но моих знаний в вэб разработках оставляет желать лучшего, не моя специфика... у меня файл не сохраняется локально, а отдаётся на растерзание юзеру (открыть/сохранить) Код (Text): if (isset($_POST['variable'])) { // тут тело обработчика // тут отдаём пользователю в браузер header("Content-Type:application/vnd.ms-excel"); header("Content-Disposition:attachment;filename=PanAccount.xls"); header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); $objWriter->save('php://output'); exit(); } соответственно в json влетает всё тело обработчика... вопрос - куда поместить echo json_encode() чтобы потом пользоваться его выводом?
Два различных Content-Type application/vnd.ms-excel и json у одного документа быть не может. Попробуйте не отпралять документ в браузер а сохранять его в файл на сервере. В json передайте имя файла, а из js в случае успеха открывайте в новом окне просмоторщик Excel.
да, я понял, что контент типы разные, но у меня есть ограничения от админа сервера - файлы на нём не сохранять... к тому-же, если я даже добьюсь от админа взаимности, то потребуется ещё прикручивать в обязательном порядке удаление файла, т.к. задачка многопользовательская и каждому юзеру нужен на свой запрос свой файл, а лезть одновременно может и два, и три человека... в общем - я Вам очень благодарен за помощь!
Гипотеза. Если нельзя сохранить на сервере, то можно отправлять и обрабатывать на стороне клиент контент в text-response PHP: <? if (isset($_POST['variable'])) { // тут тело обработчика // тут отдаём пользователю в браузер header("Content-Type:application/vnd.ms-excel"); header("Content-Disposition:attachment;filename=PanAccount.xls"); header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); $objWriter->save('php://output'); exit; } $new_file_tmp = "my_file.tmp"; echo <<<HTML <html> <head> <style> .left-inden{ width: 160px; background-color: limegreen } </style </head> <body> <form method="POST"> <input type="hidden" name="variable" value="$new_file_tmp"> <input id="go" class="left-indent" type="submit" value="Сформировать файл"> </form> <div id="st"></div> </html> <script> form = document.querySelector("form"); st = document.getElementById("st"); go = document.getElementById("go"); form.onsubmit = (event) => { event.preventDefault(); fd = new FormData(form); fetch("?", { method: "POST", body: fd }) .then((response) => response.text()) .then((text) => { console.log(text); }) .catch((error) => { console.log(`Error: ${error.message}`); }); } </script>.. HTML; посмотрите, что выводится консоле. А я ещё м.б. что-то придумаю. Удачи!
интересная мысль! но я уже "ушёл" с работы... а завтра (если оно наступит) я попробую проверить Вашу гипотезу! навскидку - может и будет работать! это очень любопытно! спасибо!
Добрый день! Как вчера обещал, посылаю дополнения 1. Как просто создать и экспотировать Excel-документ из JS HTML: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Export table to Excel</title> <style> body { font-size: 12pt; font-family: Calibri; padding : 10px; } table { border: 1px solid black; } th { border: 1px solid black; padding: 5px; background-color:grey; color: white; } td { border: 1px solid black; padding: 5px; } input { font-size: 12pt; font-family: Calibri; } </style> </head> <body> <br/> <br/> <div id="dvData"> <table> <tr> <th>Name</th> <th>Date</th> <th>Place</th> </tr> <tr> <td>row1 Col1</td> <td>row1 Col2</td> <td>row1 Col3</td> </tr> <tr> <td>row2 Col1</td> <td>row2 Col2</td> <td>row2 Col3</td> </tr> <tr> <td>row3 Col1</td> <td>row3 Col2</td> <td>row3 Col3</a> </td> </tr> </table> </div> </body> <script> dvData = document.getElementById("dvData"); function saveFile(url, filename) { const a = document.createElement("a"); a.href = url; a.download = filename || "file-name"; document.body.appendChild(a); a.click(); document.body.removeChild(a); } file = new Blob( [dvData.innerHTML], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,"} ); const url = window.URL.createObjectURL(file); saveFile(url, "myFile.xls"); window.URL.revokeObjectURL(url); </script> </html> 2. Эту затею можно попытаться применить в Вашем случае(информация к размышлению, не проверено) PHP: <? if (isset($_POST['variable'])) { // тут тело обработчика // тут отдаём пользователю в браузер header("Content-Type:application/vnd.ms-excel"); header("Content-Disposition:attachment;filename=PanAccount.xls"); header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); $objWriter->save('php://output'); exit; } $new_file_tmp = "my_file.tmp"; echo <<<HTML <html> <head> <style> .left-inden{ width: 160px; background-color: limegreen } </style </head> <body> <form method="POST"> <input type="hidden" name="variable" value="$new_file_tmp"> <input id="go" class="left-indent" type="submit" value="Сформировать файл"> </form> <div id="st"></div> </html> <script> form = document.querySelector("form"); st = document.getElementById("st"); go = document.getElementById("go"); function saveFile(url, filename) { const a = document.createElement("a"); a.href = url; a.download = filename || "file-name"; document.body.appendChild(a); a.click(); document.body.removeChild(a); } form.onsubmit = (event) => { event.preventDefault(); fd = new FormData(form); fetch("?", { method: "POST", body: fd }) .then((response) => response.text()) .then((text) => { console.log(text); //--- Export response to Excel --------------------- file = new Blob( [text], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,"} ); const url = window.URL.createObjectURL(file); saveFile(url, "myFile.xls"); window.URL.revokeObjectURL(url); //----------------------------------------------- go.style.display="none"; }) .catch((error) => { console.log(`Error: ${error.message}`); }); } </script> HTML; Удачи!
здравствуйте! а вот этот вариант отлично сработал! осталось его к прикрутить к уже существующему... красота!!! большое Вам спасибо, Вы меня уже не раз выручали ! всего Вам доброго!