jquery ajax codeigniter wiki

jquery - Descargue un archivo y redirigirlo a otra página a través de ajax



codeigniter wiki (12)

Tengo un formulario de contacto simple para descargar el archivo Excel. El problema principal ocurre, cuando se carga ajax. Deseo descargar el archivo Excel y luego redireccionar al usuario a la siguiente página. A continuación se muestra mi código con datos ficticios.

Código Ajax ...

$.ajax({ type: "POST", url: "/site/ajaxexcel.php", data: {''value'':''send''}, cache: false, success: function(html){ location.href = ''<?php echo base_url()."/site/welcome.php" ?>''; } });

Y mi código ajaxexcel.php es:

<?php $content= ''<html xmlns:x="urn:schemas-microsoft-com:office:excel"> <head> <!--[if gte mso 9]> <xml> <x:ExcelWorkbook> <x:ExcelWorksheets> <x:ExcelWorksheet> <x:Name>Sheet 1</x:Name> <x:WorksheetOptions> <x:Print> <x:ValidPrinterInfo/> </x:Print> </x:WorksheetOptions> </x:ExcelWorksheet> </x:ExcelWorksheets> </x:ExcelWorkbook> </xml> <![endif]--> </head> <body><table class="table table-condensed table-striped table-hover table-bordered pull-left" id="myTable"><thead><tr><th>Rakesh</th><th>kumar</th></tr></thead><tbody><tr><th>Rakesh</th><th>Rakesh</th></tr><tr><th>Rakesh</th><th>Rakesh</th></tr><tr><th>Rakesh</th><th>Rakesh</th></tr><tr><th>Rakesh</th><th>Rakesh</th></tr></tbody></table></body></html>''; header(''Content-type: application/excel''); header(''Content-type: image/jpeg,image/gif,image/png''); header("Content-Disposition: attachment; filename=download.xls"); header("Pragma: "); header("Cache-Control: "); echo $content; ?>

Solo quiero descargar el archivo de Excel y luego redirigir al usuario a una ubicación específica.

También puede ayudarme con su código codeigniter si lo ha hecho correctamente.


1) Ajax no es una solución.

2) window.open() emergente window.open() se bloqueará en la mayoría de los navegadores, incluso desde el mismo dominio (al menos eso estaba sucediendo en Chrome y FF hace algún tiempo, cuando traté de implementar algo similar)

Algo así haría el trabajo: (No verifica cosas como el código devuelto, por lo que la salida 404 o sin archivos provocará una redirección sin descargar)

document.getElementById(''zzz'').onclick = function() { ifrm = document.createElement(''iframe''); ifrm.style.display = "none"; ifrm.src = "https://github.com/SheetJS/test_files/blob/b07031a7bd5a8b86b9baac94267f20cf81c6d5eb/A4X_2013.xls?raw=true"; // some random xls file from github (it contains just a single "x" character in cell A-4) ifrm.onload = function() { window.location.href = "https://jquery.com"; }; document.body.appendChild(ifrm); return false; }

<a href="#" id="zzz"> click me </a>

PD: querrá la application/octet-stream encabezado de Content-type para algunos tipos de archivos (como pdf) para obligar al navegador a descargar archivos en lugar de utilizar los visores integrados.



Al usar https://github.com/johnculviner/jquery.fileDownload js:

$.ajax({ type: "POST", url: "/site/ajaxexcel.php", data: {''value'':''send''}, cache: false, success: function(html) { $.fileDownload("ajaxheader.php", { successCallback: function (url) { location.href = ''<?php echo base_url()."/site/welcome.php" ?>''; }, failCallback: function (responseHtml, url) { alert(''error''); } }); } });

Y en php side, agrega la siguiente línea en los encabezados:

header("Set-Cookie: fileDownload=true; path=/");


Creo que es muy difícil de descargar. Utilice PHP Excel para crear archivos y descargar.


En Ajax .... Simplemente puedes crear un archivo de Excel en el servidor ... la respuesta de ajax será la ruta del archivo de Excel ... En el éxito de Ajax, abre el archivo de Excel en una pestaña nueva (descarga Excel automáticamente) y al mismo tiempo abre una nueva pestaña con una nueva ubicación.

código de muestra dentro del éxito de ajax dado a continuación

window.open("path to excel.."); window.open("new location");

también puede usar (si es necesario)

window.location.replace("new location");

Abre múltiples enlaces en Chrome a la vez como nuevas pestañas


En realidad, para esta situación, recomiendo abrir la ubicación del archivo con la opción en blanco y redirigir. Para este propósito, necesita crear una estructura de formulario y enviarla a action.php

Ejemplo:

var form = document.createElement("form"); form.setAttribute("method", "post"); form.setAttribute("action", "action.php"); form.setAttribute("target", "myView"); // or you can use _blank : form.setAttribute("target", "_blank"); var hiddenField = document.createElement("input"); hiddenField.setAttribute("type", "hidden"); hiddenField.setAttribute("name", "message"); hiddenField.setAttribute("value", "val"); form.appendChild(hiddenField); document.body.appendChild(form); window.open('''', ''myView''); form.submit(); alert("Redirect in 10 second!"); setTimeout(function(){ location.href = "/home" }, 10000);


No puede descargar el archivo utilizando la solicitud de Ajax. De todos modos, debe redireccionar a una ubicación particular que le permitirá descargar el archivo. Podría intentarlo con esto, pero intente descargar el archivo en una pestaña separada y redirija su página a una página en particular.

<input id="btnGetResponse" type="button" value="Redirect" /> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> <script type="text/javascript"> $(function () { $("#btnGetResponse").click(function () { window.open(''/test/excel.php''); window.location = "http://.com/"; }); }); </script>

También desde su archivo PHP (excel.php) elimine esta línea. De lo contrario, descargará su archivo como JPG o PNG

header(''Content-type: image/jpeg,image/gif,image/png'');


Pruebe el siguiente método, espero que funcione

  1. abra ajaxexcel.php en una nueva ventana a través de window.open
  2. comenzará la descarga, luego ciérrelo.
  3. Tan pronto como se cierre, redirija la página.

Puede lograrlo creando una forma virtual y publicándola.

function autoGenerateAndSubmitForm(method, url, post_data) { var element = document.getElementById("virtual_form"); if(element != null ) { element.parentNode.removeChild(element); } var form = document.createElement("form"); form.setAttribute("id", "virtual_form"); form.setAttribute("style", "display:none;"); form.setAttribute("target", "_blank"); // This line is very important in your case for redirect in other page and download your file. form.method = method; form.action = url; for(i in post_data) { var element=document.createElement("input"); element.value=post_data[i]; element.name=i; form.appendChild(element); } document.body.appendChild(form); form.submit(); form.parentNode.removeChild(form); }

Llama al método anterior donde lo necesites, supongo que lo has llamado en evento de clic

$(''button'').on(''click'', function(e){ autoGenerateAndSubmitForm("POST","/site/ajaxexcel.php",{''value'':''send''}); location.href = ''<?php echo base_url()."/site/welcome.php" ?>''; });

Quite la línea inferior de su código del lado del servidor.

header(''Content-type: image/jpeg,image/gif,image/png'');


Solo uso con javascript simple

window.location.replace(###file url###);



Método 1 : con jQuery AJAX

Reemplaza tu ajax con el siguiente código ...

<script> $.ajax({ type: "POST", url: "/site/ajaxexcel.php", data: {''value'':''send''}, cache: false, success: function(html) { window.open("/site/ajaxexcel.php"); location.href = ''<?php echo base_url()."/site/welcome.php" ?>''; } }); </script>

window.open abrirá el archivo ajaxexcel.php en una ventana separada y location.href se redireccionará al archivo welcome.php dado. Este es el mejor método para esto.

Método 2 : con el complemento de descarga de archivos jQuery

Simplemente incluya el script jqueryfiledownload y haga algo como esto:

<a class="download" href="/path/to/file">Download</a> <script> $(document).on("click", "a.download", function () { $.fileDownload($(this).prop(''href'')) .done(function () { alert(''File download a success!''); //success code}) .fail(function () { alert(''File download failed!'');//failure code }); return false; //this is critical to stop the click event which will trigger a normal file download }); </script>

Ahora cuando haces clic en el ancla, tu archivo se descarga y puedes escribir tu código de éxito / falla en las funciones de done()/fail() , respectivamente.