Foros del Web » Programando para Internet » Javascript »

Devolver un .zip para descarga tras crearlo con PHP

Estas en el tema de Devolver un .zip para descarga tras crearlo con PHP en el foro de Javascript en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 18/01/2013, 17:30
 
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...
  #2 (permalink)  
Antiguo 18/01/2013, 17:58
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: Devolver un .zip para descarga tras crearlo con PHP

Hola:

Cita:
Iniciado por navegantes Ver Mensaje
Para llamar al archivo PHP que crea el .zip lo hago con ajax ya que la página no debe ser redireccionada.
Los navegadores hoy por hoy no enlazan a ficheros .zip, así que lo descargará ('Lo has probado!)

Sobre lo de la redirección... si enlazas a otra ventana resolverías el problem...

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 18/01/2013, 18:41
 
Fecha de Ingreso: abril-2009
Ubicación: Barcelona
Mensajes: 113
Antigüedad: 15 años
Puntos: 9
Respuesta: Devolver un .zip para descarga tras crearlo con PHP

Cita:
Iniciado por caricatos Ver Mensaje
Hola:



Los navegadores hoy por hoy no enlazan a ficheros .zip, así que lo descargará ('Lo has probado!)

Sobre lo de la redirección... si enlazas a otra ventana resolverías el problem...

Saludos
Veamos en una página tengo un botón que al hacer clic llama al código de javascript. Este a su vez llama a otro archivo .php que crea el archivo .zip. Ese archivo zip puedo guardarlo en una carpeta del servidor, pero lo que yo quiero es que me salga la ventana de descargar del navegador cuando el fichero se ha terminado de crear. Esa es la ventana que no logro que salga.

El código PHP puesto es el del archivo que crea el zip. Tal y como está y si lo ejecuto, en el navegador me sale la ventana de descarga del archivo, pero cuando hago la llamada desde el otro fichero no me sale.

No se si me explico.

¿A que te refieres con enlazar a otra ventana?
__________________
- Y lo que todavía me queda por aprender...
  #4 (permalink)  
Antiguo 18/01/2013, 21:36
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 9 meses
Puntos: 1567
Respuesta: Devolver un .zip para descarga tras crearlo con PHP

No entiendo, si los estás comprimiendo correctamente debería descargarse automáticamente, yo utilizo esta clase
Demo:
http://foros.emprear.com/php/zipclass/
En el zip está el código de la demo, mirá el uso de los encabezados ppara el forzado de la descarga
Código PHP:
Ver original
  1. header("Content-type: application/octet-stream");
  2. header("Content-disposition: attachment; filename=$archivo.zip");
en generar_zip.php
Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #5 (permalink)  
Antiguo 19/01/2013, 05:38
 
Fecha de Ingreso: abril-2009
Ubicación: Barcelona
Mensajes: 113
Antigüedad: 15 años
Puntos: 9
Respuesta: Devolver un .zip para descarga tras crearlo con PHP

Cita:
Iniciado por emprear Ver Mensaje
No entiendo, si los estás comprimiendo correctamente debería descargarse automáticamente, yo utilizo esta clase
Demo:
http://foros.emprear.com/php/zipclass/
En el zip está el código de la demo, mirá el uso de los encabezados ppara el forzado de la descarga
Código PHP:
Ver original
  1. header("Content-type: application/octet-stream");
  2. header("Content-disposition: attachment; filename=$archivo.zip");
en generar_zip.php
Saludos
Hola @emprear... pues yo tampoco entiendo las cosas... debo estar gafado o algo así.
Las dos lineas que me comentas ya las tengo implementadas desde el principio en mi código pero nada de nada. Bueno en realidad tu primer header hace referencia a application/octet-stream mientras que yo lo tengo como application/zip pero probado tu sistema y tampoco... no hay manera no se que puede ser la verdad.
__________________
- Y lo que todavía me queda por aprender...
  #6 (permalink)  
Antiguo 19/01/2013, 06:06
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 9 meses
Puntos: 1567
Respuesta: Devolver un .zip para descarga tras crearlo con PHP

probaste solo cambiando el header ó utilizaste toda mis script?, es decir la demo en su conjunto

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #7 (permalink)  
Antiguo 19/01/2013, 06:09
 
Fecha de Ingreso: abril-2009
Ubicación: Barcelona
Mensajes: 113
Antigüedad: 15 años
Puntos: 9
Respuesta: Devolver un .zip para descarga tras crearlo con PHP

Ya lo he resuelto, aunque cambiando el planteamiento.

Buscando y buscando me he encontrado con este articulo: http://www.forosdelweb.com/f18/ejecu...pagina-686398/

Así que adaptándolo un poco y nada (básicamente borrar el contenido del formulario y pasar la id por un campo hidden he logrado que me salga la dichosa recarga.

Ahora bien el misterio de porque no descargaba antes sin necesidad de este cambio sigo sin entenderlo..

Gracias a todos por la ayuda
__________________
- Y lo que todavía me queda por aprender...
  #8 (permalink)  
Antiguo 19/01/2013, 06:15
 
Fecha de Ingreso: abril-2009
Ubicación: Barcelona
Mensajes: 113
Antigüedad: 15 años
Puntos: 9
Respuesta: Devolver un .zip para descarga tras crearlo con PHP

Cita:
Iniciado por emprear Ver Mensaje
probaste solo cambiando el header ó utilizaste toda mis script?, es decir la demo en su conjunto

Saludos
He probado solo cambiando el header y luego con todo tu script entero y nada de nada...

De todas formas cuando he comenzado a investigar sobre el tema me fui a php.net como es lógico y ya los propios ejemplos me dan muchos problemas a la hora de crear los archivos.
Creo que mi problema está con las rutas... En algunas ocasiones me lanzaba errores indicando que los ficheros no existían, pero la ruta que me daba como invalida si que estaba. Luego me creaba el zip con los archivos pero corruptos. o me creaba el zip con toda la ruta compelta c:\xampp\htdocs\ etc etc no se la verdad es que he tenido problemas para implementar algo que en principio es sencillo.

Pero bueno, por el momento no le daré más vueltas que tengo que seguir con otras partes y si esta funciona (al menos por el momento si) pues ya volveré otro día a investigar...

Gracias por tu interés
__________________
- Y lo que todavía me queda por aprender...

Etiquetas: ajax, devolver, funcion, php, tras, zip
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:21.