Quiero enviar una "solicitud de descarga ajax" cuando hago clic en un botón, así que lo intenté de esta manera:
javascript:
var xhr = new XMLHttpRequest();
xhr.open("GET", "download.php");
xhr.send();
download.php:
<?
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename= file.txt");
header("Content-Transfer-Encoding: binary");
readfile("file.txt");
?>
pero no funciona como se esperaba, ¿cómo puedo hacerlo? Gracias de antemano
location.href='download.php';
Respuestas:
Actualización 27 de abril de 2015
Próximamente en la escena HTML5 está el atributo de descarga . Es compatible con Firefox y Chrome, y pronto llegará a IE11. Dependiendo de sus necesidades, puede usarlo en lugar de una solicitud AJAX (o usar
window.location
) siempre que el archivo que desea descargar esté en el mismo origen que su sitio.Siempre puede realizar la solicitud AJAX /
window.location
una reserva utilizando algo de JavaScript para probar sidownload
es compatible y, si no, cambiarlo para llamarwindow.location
.Respuesta original
No puede hacer que una solicitud AJAX abra el mensaje de descarga, ya que tiene que navegar físicamente hasta el archivo para solicitar la descarga. En su lugar, puede usar una función de éxito para navegar a download.php. Esto abrirá el mensaje de descarga, pero no cambiará la página actual.
Aunque esto responde a la pregunta, es mejor usar
window.location
y evitar la solicitud AJAX por completo.fuente
Para que el navegador descargue un archivo, debe realizar la solicitud de esta manera:
fuente
<a>
etiqueta con JS, también "sobre la marcha", pero debe agregarladocument.body
. Ciertamente quieres ocultarlo al mismo tiempo.En realidad, no necesitas ajax en absoluto para esto. Si simplemente configura "download.php" como href en el botón, o, si no es un enlace, use:
El navegador debe reconocer la descarga binaria y no cargar la página real, sino servir el archivo como descarga.
fuente
window.location
es JavaScript.Solución de navegador cruzado, probada en Chrome, Firefox, Edge, IE11.
En el DOM, agregue una etiqueta de enlace oculta:
Luego:
fuente
Authorization
?window.URL.revokeObjectURL(el.href);
despuésel.click()
?Es posible. Puede iniciar la descarga desde dentro de una función ajax, por ejemplo, justo después de crear el archivo .csv.
Tengo una función ajax que exporta una base de datos de contactos a un archivo .csv y, justo después de que finaliza, inicia automáticamente la descarga del archivo .csv. Entonces, después de obtener el responseText y todo está bien, redirijo el navegador de esta manera:
Mi archivo download.php se ve así:
No hay ninguna actualización de página y el archivo comienza a descargarse automáticamente.
NOTA : probado en los siguientes navegadores:
fuente
yo prefiero
location.assign(url);
Ejemplo de sintaxis completo:
developer.mozilla.org/en-US/docs/Web/API/Location.assign
fuente
Decodificar un nombre de archivo desde el encabezado es un poco más complejo ...
fuente
Esta solución no es muy diferente a las anteriores, pero para mí funciona muy bien y creo que está limpia.
Sugiero codificar en base64 el lado del servidor de archivos (base64_encode (), si está usando PHP) y enviar los datos codificados en base64 al cliente
En el cliente haces esto:
Este código coloca los datos codificados en un enlace y simula un clic en el enlace, luego lo elimina.
fuente
Tus necesidades están cubiertas por
window.location('download.php');
Pero creo que necesitas pasar el archivo a descargar, no siempre descargar el mismo archivo, y es por eso que estás usando una solicitud, una opción es crear un archivo php tan simple como showfile.php y haz una solicitud como
showfile.php
donde archivo es el nombre del archivo pasado a través de Obtener o Publicar en la solicitud y luego capturar la respuesta en una función simplemente
fuente
hay otra solución para descargar una página web en ajax. Pero me refiero a una página que primero debe procesarse y luego descargarse.
Primero, debe separar el procesamiento de la página de la descarga de resultados.
1) Solo se realizan los cálculos de la página en la llamada ajax.
Espero que esta solución pueda ser útil para muchos, como lo fue para mí.
fuente
Para aquellos que buscan un enfoque más moderno, puede usar el
fetch API
. El siguiente ejemplo muestra cómo descargar un archivo de hoja de cálculo. Se hace fácilmente con el siguiente código.Creo que este enfoque es mucho más fácil de entender que otras
XMLHttpRequest
soluciones. Además, tiene una sintaxis similar aljQuery
enfoque, sin la necesidad de agregar bibliotecas adicionales.Por supuesto, le aconsejaría comprobar en qué navegador está desarrollando, ya que este nuevo enfoque no funcionará en IE. Puede encontrar la lista completa de compatibilidad del navegador en el siguiente enlace .
Importante : En este ejemplo, estoy enviando una solicitud JSON a un servidor que escucha el archivo
url
. Estourl
debe establecerse, en mi ejemplo, supongo que conoce esta parte. Además, considere los encabezados necesarios para que su solicitud funcione. Como estoy enviando un JSON, debo agregar elContent-Type
encabezado y configurarloapplication/json; charset=utf-8
para que el servidor sepa el tipo de solicitud que recibirá.fuente
La solución de @Joao Marcos funciona para mí, pero tuve que modificar el código para que funcione en IE, a continuación, si se ve el código
fuente