Descarga de un archivo con javascript - extjs
Hola a tod@s,
Estoy tratando de descargar un archivo que genero. Es la exportación de una base de datos a un .txt. El archivo se genera bien, pero cuando trato de que se "autodescargue" me lanza a una nueva página donde se muestra el contenido del archivo.
El codigo que pongo pertenece al boton de una toolbar de ext, al pulsarlo llamo por ajax para que se genere el archivo, y si el resultado es success es cuando intento descargarlo, pero yo quiero permanecer en la misma página en la que estoy y que aparezca la tipica ventanita del explorador indicando si quieres abrirlo o guardarlo.....
{
text:'Exportar',
tooltip:'Exportar listado de productos',
iconCls:'icon-export',
listeners: {
click: function(){
Ext.Ajax.request({ //dispara la petición
url: 'globals/ajaxExportFile.class.php',
method:'POST',
waitMsg:'Generando archivo, por favor espere...',
success: function(){
window.location.href = "exportFiles/exportFile.txt"
},
failure: function(){
Ext.Msg.alert('Aviso','Se ha producido un error.');
}
});
}
}
}
Si alguien sabe como poder hacerlo..........
Gracias a tod@s
Hola Crysfel, super util el plugin para trabajar con grids y exportar a excel. Me ha solucionado un monton :-)
Muxisimas gracias.
Una cosa, a ver si me puedes decir.........
Mi base de datos esta en utf8, y al abrir con excel el archivo me aparecen todos los acentos y eñes mal.....
He probado con
utf8_decode()
header("Content-type: application/x-msdownload; charset=latin");
Pero nada, me lo sigue poniendo mal. Si sabes algo al respecto se agradeceria enormemente
Gracias
Yo lo que normalmente hago es que cuando genero el archivo también ahí mismo lo descargo, claro si el archivo se genera muchas veces lo ideal es guardarlo en cache del server para evitar generarlo muchas veces.
Mira, te paso un plugin que hice para CodeIgniter donde exporto a Excel y también descargo el archivo desde ExtJS.
* crysfel@bleext.com
* http://www.crysfel.com * @fecha 10 de Febrero 2011. Monterrey NL * * Modo de uso: * //1.- cargar el plugin $this->load->plugin('to_excel'); //2.- Preparar la información que se exportará $object = array( "columns" => array( //2.1.- Definir los encabezados array("encabezado"=>"Curso","dataindex"=>"curso"), array("encabezado"=>"Participantes","dataindex"=>"participantes") ), "data" => array( //2.2.- Definir la información de las columnas array("curso"=>"Testing","participantes"=>10), array("curso"=>"Testing","participantes"=>10), array("curso"=>"Testing","participantes"=>10) ) ); //3.- Invocar el plugin enviando la información y el nombre del archivo. to_excel($object, "nombre del archivo"); * * */ function to_excel($object, $filename = 'Archivo'){ $headers = ''; // just creating the var for field headers to append to below $data = ''; // just creating the var for field data to append to below foreach ($object["columns"] as $column) { $headers .= $column["encabezado"] . "\t"; } foreach ($object["data"] as $row) { $line = ''; foreach ($object["columns"] as $column) { $value = ""; if ((!isset($row[$column["dataindex"]])) || ($row[$column["dataindex"]] == "")) { $value = "-\t"; } else { $value = str_replace('"', '""', $row[$column["dataindex"]]); $value = '"' . $row[$column["dataindex"]] . '"' . "\t"; } $line .= $value; } $data .= trim($line)."\n"; } $data = str_replace("\r","",$data); header("Content-type: application/x-msdownload"); header("Content-Transfer-Encoding: binary"); header("Content-Disposition: attachment; filename=\"$filename.xls\""); echo "$headers\n$data"; } Ahora, del lado de ExtJs solamente hago lo siguiente: new Ext.Button({ text : "Exportar a Excel", handler : function(){ document.location = "controller/exportar/2" } }); Y listo, con eso es suficiente. Lo más importante de todo esto son las cabeceras que se le dan al response, en este caso la responsable de iniciar la descarga es esta: header("Content-Disposition: attachment; filename=\"$filename.xls\""); Saludos
* crysfel@bleext.com
* http://www.crysfel.com * @fecha 10 de Febrero 2011. Monterrey NL * * Modo de uso: * //1.- cargar el plugin $this->load->plugin('to_excel'); //2.- Preparar la información que se exportará $object = array( "columns" => array( //2.1.- Definir los encabezados array("encabezado"=>"Curso","dataindex"=>"curso"), array("encabezado"=>"Participantes","dataindex"=>"participantes") ), "data" => array( //2.2.- Definir la información de las columnas array("curso"=>"Testing","participantes"=>10), array("curso"=>"Testing","participantes"=>10), array("curso"=>"Testing","participantes"=>10) ) ); //3.- Invocar el plugin enviando la información y el nombre del archivo. to_excel($object, "nombre del archivo"); * * */ function to_excel($object, $filename = 'Archivo'){ $headers = ''; // just creating the var for field headers to append to below $data = ''; // just creating the var for field data to append to below foreach ($object["columns"] as $column) { $headers .= $column["encabezado"] . "\t"; } foreach ($object["data"] as $row) { $line = ''; foreach ($object["columns"] as $column) { $value = ""; if ((!isset($row[$column["dataindex"]])) || ($row[$column["dataindex"]] == "")) { $value = "-\t"; } else { $value = str_replace('"', '""', $row[$column["dataindex"]]); $value = '"' . $row[$column["dataindex"]] . '"' . "\t"; } $line .= $value; } $data .= trim($line)."\n"; } $data = str_replace("\r","",$data); header("Content-type: application/x-msdownload"); header("Content-Transfer-Encoding: binary"); header("Content-Disposition: attachment; filename=\"$filename.xls\""); echo "$headers\n$data"; } Ahora, del lado de ExtJs solamente hago lo siguiente: new Ext.Button({ text : "Exportar a Excel", handler : function(){ document.location = "controller/exportar/2" } }); Y listo, con eso es suficiente. Lo más importante de todo esto son las cabeceras que se le dan al response, en este caso la responsable de iniciar la descarga es esta: header("Content-Disposition: attachment; filename=\"$filename.xls\""); Saludos
¿Conoces a alguien que pueda responder esta pregunta? Comparte el link en Twitter o Facebook
Es necesario registrarse para poder participar en el foro! Si ya tienes una cuenta puedes entrar y comentar en este foro.