2010-08-30 30 views
19

Quiero utilizar la funcionalidad ajax para descargar, donde el usuario hará clic en el enlace de descarga que (usando ajax y $ _GET) accederá a un archivo PHP que procesará las variables $ _GET enviadas y accederá el archivo correcto para descargar.Descarga de archivos Ajax usando Jquery, PHP

Tengo algunos scripts PHP para manejar el procesamiento de las variables $ _GET que funcionan por sí solos pero cuando se accede usando Ajax, dejan de funcionar.

El Ajax im/código PHP usando es el siguiente:

function ajaxDown(){ 
$('#downloadmsg').html(
    '<img src=\"media/images/ajaxloader.gif\" width=\"128\" height=\"15\">'); 
$('#downloadmsg').load(
'media/downloads/downManager.php?file=".$filequery['filename']."&ftype=".$downex[1]."'); 
} 

Por favor, mirar a través de mi código y me ayude a encontrar lo que estoy haciendo mal.

Gracias

+0

Por favor, mostrar qué tipo de código 'downManager.php' emite. –

+0

¿No es esto un no problema? Si hago clic en "descargar este archivo" en cualquier página determinada, y el archivo se puede descargar, se descargará sin la carga de página dada. ¿Me estoy perdiendo de algo? –

+0

@Pekka - downManager.php abre el archivo solicitado para descargar, por ejemplo, un pdf –

Respuesta

54

creo que el problema es que usted está tratando de cargar un archivo en consecuencia #downloadmsg, que no va a funcionar porque .load() sólo se va a cargar los resultados como HTML .. .NOT datos binarios u otra codificación.

Un enfoque que podría funcionar es la creación de un iframe oculto en HTML, así:

<iframe id="secretIFrame" src="" style="display:none; visibility:hidden;"></iframe> 

continuación, establezca el attr del iframe a su cadena de consulta:

$("#secretIFrame").attr("src","myphpscript.php?option1=apple&option2=orange"); 

y luego usando PHP encabezados para forzar la descarga cuando se establece la fuente (aquí hay un ejemplo de un encabezado de exportador configurado desde uno de mis scripts que usa una secuencia de octetos):

header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Content-Type: application/force-download"); 
header("Content-Type: application/octet-stream"); 
header("Content-Type: application/download"); 
header("Content-Disposition: attachment;filename=data.xls "); 
header("Content-Transfer-Encoding: binary "); 

Espero que esto ayude!

+0

Creo que este podría ser el problema, déjame probar tu solución. Gracias –

+0

Hmmmmm. Este truco funcionó para mí. Gracias +1 – Awan

+0

Muchas gracias por esta solución – mangia

5

¡Sé que llego tarde! ¡Pero creo que tengo una solución que es un poco más limpia sin el uso de un iframe oculto y ni siquiera necesitarás una solicitud de ajax para hacerlo! Usando PHP encabezados como se señala en la respuesta aceptada en un archivo download.php

<?php 
     //download.php 
     /* 
      All your verification code will go here 
     */  
     header("Pragma: public"); 
     header("Expires: 0"); 
     header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
     header("Content-Type: application/force-download"); 
     header("Content-Type: application/octet-stream"); 
     header("Content-Type: application/download"); 
     header("Content-Disposition: attachment;filename=".$_GET['file']); 
     header("Content-Transfer-Encoding: binary "); 

Y en el extremo JS, simplemente

function download(filename){ 
    window.location="http://whateveryoursiteis.com/download.php?file="+filename; 
} 

funciona como un encanto: O

+0

no funciona con solicitudes de correos –

+0

No debería funcionar con las solicitudes de envío, es pasar el parámetro en la URL. En mi nota anterior mencioné que no usa ajax para realizar la descarga. – ksealey

Cuestiones relacionadas