Pregunta

Tengo un script que fuerza una descarga y hago una llamada a esto a través de Javascript. Sin embargo, el cuadro de diálogo no aparece, aquí está el script download.php:

header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers 
header("Content-Type: $ctype");
// change, added quotes to allow spaces in filenames, by Rajkumar Singh
header("Content-Disposition: attachment; filename=\"".basename($properFilename)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
readfile("$filename");
exit();

Aquí está el Javascript (usando JQuery):

///force download
           $.ajax({
           type: "GET",
           url: "download.php",
           data: 'file=' + msg + '&properFilename=' + properFileName,
           success: function(msg){

              window.location.href = msg;

         });//ajax

Esto redirige mi navegador a otra página en lugar de mostrar el cuadro de diálogo hacia abajo.

Sé que el mensaje JS variable contiene el archivo con los encabezados correctos, pero no sé qué hacer con él para que muestre el cuadro de diálogo de descarga.

Gracias a todos

p.s. No sabía dónde poner este hilo JS o PHP.

EDITAR:

Tengo el enfoque correcto, estoy seguro de eso :) - Un usuario llega a mi sitio, completa un formulario y presiona enviar. Después de unos segundos, su archivo debería aparecer en un cuadro de diálogo que pueden descargar. Para hacer esto:

Realizo una llamada AJAX para obtener el archivo y descargarlo. Yo uso el script PHP para enviar los encabezados. ¡¡Ahora todo lo que necesito es una forma de que aparezca el cuadro de diálogo de descarga !!

¿Fue útil?

Solución

No muestra el cuadro de diálogo por el solo hecho de que es una llamada Ajax.

window.location.href = msg;

Eso es lo que te está redirigiendo. No creo que necesite una llamada ajax aquí, simplemente llame a la página normalmente con un enlace href.

edit

Si desea que el formulario se envíe y muestre el cuadro de diálogo para la descarga, haga lo siguiente:

<script>
function showDialogBox(form) {
    form.submit();
    window.location.href = "/download.php?file=XXX&properFilename=XXX";
}
</script>
<form onsubmit="showDialogBox(this);">

</form>

Otros consejos

Si tiene el script download.php completo, no puedo encontrar la variable $ file (solo un $ filename), pero en JS envías una variable $ file. Segundo: algo está mal en JS: ¿por qué usa ese nombre de variable msg en data: y en success: ?

Mi opinión es que esto puede esperarse, como señala Sktrdie. No puedo probar en este momento, pero si lo piensas: el usuario, per se, no recibe ninguna notificación sobre las cosas de AJAX que estás haciendo. Tener de repente un mensaje así sería irritante.

Supongo que si crea un iframe (¿incluso oculto?) en esa página y redirige a esa URL de descarga, obtendría ese diálogo. YMMV, HTH.

No he codificado php por un tiempo, así que no estoy seguro de si hay algún problema con su código. Pero creo que el problema está en tu enfoque. Necesita cargar download.php en un marco, no como respuesta a una llamada ajax. Entonces, básicamente, debe formar un iframe invisible en el documento y apuntarlo a download.php con los parámetros get agregados a la url.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top