Ver Mensaje Individual
  #1 (permalink)  
Antiguo 18/01/2013, 17:30
navegantes
 
Fecha de Ingreso: abril-2009
Ubicación: Barcelona
Mensajes: 113
Antigüedad: 15 años
Puntos: 9
Pregunta Devolver un .zip para descarga tras crearlo con PHP

Hola a todos.

Tengo un archivo donde tengo un botón que al ser pulsado llama a otro fichero PHP que crea un archivo .zip de un directorio.

Mi problema es que quiero que tras pulsar el botón y ser creado el .zip se ponga automáticamente a descargar. Es decir que salga la típica ventana de descarga del navegador.

Para llamar al archivo PHP que crea el .zip lo hago con ajax ya que la página no debe ser redireccionada.

El archivo PHP que crea el .zip lo hace correctamente así que por ese lado funciona, y si le pongo que el resultado me lo meta en un alert (si ya se algo raro pero es para probar) este se me llena de simbolos raros (normal) pero al menos se que algo está enviado, lo único que no soy capaz de que se muestre.
El Javascript es el siguiente:

Código Javascript:
Ver original
  1. $(".down").on("click",function(){
  2.     id = this.id;
  3.      $.ajax({
  4.                 type: "POST",
  5.                    url: "/down.php",
  6.                    data: "id="+id,
  7.                 cache: false,
  8.                   success: function(data){
  9.                         //alert(data)
  10.  
  11.                 }
  12.         });
  13. });

El código PHP que genera el file y devuelve el archivo es el siguiente es el siguiente:

Código PHP:
<?php
    
    session_start
(); 
    
    if(!isset(
$_SESSION['username'])){ header("Location: login.php"); }
    
    
$id=$_POST['id'].'/';
    
    
ini_set('max_execution_time'300);
    
    
$zip = new ZipArchive();
    
    
$zip_name='project_'.rand().'.zip';
    
    if (
$zip->open($zip_nameZIPARCHIVE::CREATE) !== TRUE) {
        die (
"Can't open the file");
    }
    
    
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($id));
    
    foreach (
$iterator as $key=>$value) {
        
$zip->addFile(realpath($key), $key) or die ("ERROR: $key");
    }
    
    
$zip->close();
    if(
file_exists($zip_name)){
        
header('Content-type: "application/zip"');
        
header('Content-Disposition: attachment; filename="'.$zip_name.'"');
        
readfile($zip_name);
        
        
unlink($zip_name);
    }
?>
¿Cómo logro que me muestre la ventana del navegador para poder descargar el fichero?

Gracias de antemano.
__________________
- Y lo que todavía me queda por aprender...