Foros del Web » Programando para Internet » PHP »

Forzar descarga zip, desesperado!!!

Estas en el tema de Forzar descarga zip, desesperado!!! en el foro de PHP en Foros del Web. Buenas a todos. He estado buscando como forzar la descarga de un zip, y lo único que consigo en localhost es que me descargue el ...
  #1 (permalink)  
Antiguo 29/01/2015, 01:28
Avatar de adrirs11  
Fecha de Ingreso: diciembre-2012
Ubicación: BCN
Mensajes: 107
Antigüedad: 11 años, 3 meses
Puntos: 1
Forzar descarga zip, desesperado!!!

Buenas a todos.

He estado buscando como forzar la descarga de un zip, y lo único que consigo en localhost es que me descargue el archivo dentro del proyecto...en vez de descargarlo directamente o mostrar la tipica ventana del explorador de windows para guardarlo.
El caso es que al lanzar la web en mi dominio no hace nada...muestra el mensaje de que el zip se ha descargado (mensaje que yo muestro al realizar la descarga correctamente), pero sin embargo no descarga nada.

He buscado ya en muchos foros y webs y todas realizan la descarga de la misma forma, pero no me funciona. Gracias por la ayuda, dejo el código aquí:

Código PHP:
//Cambiamos el valor de tiempo de ejecución a 300 segundos (5 minutos)
    
ini_set("max_execution_time"300);

    
# create new zip opbject
    
$zip = new ZipArchive();

    
$zip->open("calibraciones.zip"ZipArchive::CREATE);
    
$nombre basename("calibraciones.zip");
    
    
//Miramos que archivos quiere descargar el usuario y los introducimos en el zip
    
if ($referencias == 1){
        
//Añadimos un directorio vacio llamado "Referencias"
        
$zip->addEmptyDir("Referencias");
        
//Función encargada de descargar las referencias y meterlas en el directorio "Referencias"
        
DescargarReferencias($ids$rutas$introducidos$zip); 
    }
    if (
$patrones == 1){
        
//Añadimos un directorio vacio llamado "Patrones"
        
$zip->addEmptyDir("Patrones");
        
//Funcion encargada de descargar los patrones y meterlos en el directorio "Patrones"
        
DescargarPatrones($ids$introducidos$zip$nombresDePatrones$rutasDePatrones);
    }
    if (
$procedimientos == 1){
        
//Añadimos un directorio vacio llamado "Procedimientos"
        
$zip->addEmptyDir("Procedimientos");
        
//Función encargada de descargar los procedimientos y meterlos en el directorio "Procedimientos"
        
DescargarProcedimientos($ids$introducidos$zip$nombresDeProcedimientos$rutasDeProcedimientos);
    }

    
//Cerramos el zip
    
$zip->close();

    
//Si no se ha introducido ningún archivo en el zip porque no se han encontrado las rutas..no forzamos la descarga 
    
if ($introducidos != 0){
        
//Mandamos el zip al navegador para realizar la descarga
        
header("Pragma: public");
        
header("Expires: 0");
        
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        
header("Cache-Control: private",false);
        
header("Content-Length: ".filesize($nombre));
        
header('Content-disposition: attachment; filename='.$nombre);
        
header('Content-type: application/zip');
        
readfile($nombre);
    } 

Última edición por adrirs11; 29/01/2015 a las 02:03
  #2 (permalink)  
Antiguo 29/01/2015, 04:35
Avatar de ipraetoriux  
Fecha de Ingreso: abril-2010
Ubicación: ipraetoriux.com
Mensajes: 1.125
Antigüedad: 14 años
Puntos: 155
Respuesta: Forzar descarga zip, desesperado!!!

Probá cambiando el header("Content-type: application/zip"); por

Código PHP:
Ver original
  1. header("Content-type: application/octet-stream");

Supongo que $nombre tiene la extension .zip incluida, no? para que quede de esta estructura

Código PHP:
Ver original
  1. header("Content-disposition: attachment; filename=archivos.zip");
  #3 (permalink)  
Antiguo 29/01/2015, 04:39
Avatar de ipraetoriux  
Fecha de Ingreso: abril-2010
Ubicación: ipraetoriux.com
Mensajes: 1.125
Antigüedad: 14 años
Puntos: 155
Respuesta: Forzar descarga zip, desesperado!!!

Tambien podes usar alguna libreria como esta...https://www.devco.net/code/zipfile.inc.txt

La he usado un par de veces y anda bien
  #4 (permalink)  
Antiguo 29/01/2015, 04:54
Avatar de adrirs11  
Fecha de Ingreso: diciembre-2012
Ubicación: BCN
Mensajes: 107
Antigüedad: 11 años, 3 meses
Puntos: 1
Respuesta: Forzar descarga zip, desesperado!!!

Asi es...nombre como ves al principio incluye la extensión. Ya probé con octet-stream pero nada... a seguir intentando.
Antes de probar otras clases y librerias quiero intentar sacarlo, ya que la creación del zip funciona perfectamente..solo es el forzar la descarga...y sospecho que si no funciona así tampoco lo hará con otra clase. Gracias

Alguien tiene alguna idea mas?
  #5 (permalink)  
Antiguo 29/01/2015, 05:13
Avatar de ipraetoriux  
Fecha de Ingreso: abril-2010
Ubicación: ipraetoriux.com
Mensajes: 1.125
Antigüedad: 14 años
Puntos: 155
Respuesta: Forzar descarga zip, desesperado!!!

y probaste haciendo ...

Código PHP:
Ver original
  1. echo readfile($nombre);

o

Código PHP:
Ver original
  1. print readfile($nombre);
  #6 (permalink)  
Antiguo 29/01/2015, 06:01
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: Forzar descarga zip, desesperado!!!

Cita:
Iniciado por adrirs11 Ver Mensaje
Asi es...nombre como ves al principio incluye la extensión.
¿Seguro?

creo recordar que basename quitaba la extensión... ;)
__________________
>> Eleazan's Source
>> @Eleazan
  #7 (permalink)  
Antiguo 29/01/2015, 06:22
Avatar de adrirs11  
Fecha de Ingreso: diciembre-2012
Ubicación: BCN
Mensajes: 107
Antigüedad: 11 años, 3 meses
Puntos: 1
Respuesta: Forzar descarga zip, desesperado!!!

He probado con echo y print y nada...en localhost me lo sigue descargando dentro del proyecto...y en el dominio no hace nada.

Eleazan basename elimina la extención si tu se la especificas basename("mizip.zip", ".zip), si no le especificas el sufijo o ruta la muestra entera.

Sabeis si puede ser cuestion de los headers que acepta el servidor?? He leido algo sobre el httpd.conf, pero no estoy seguro y prefiero no tocar de momento ya que no se muy bien que linea añadir o descomentar. Gracias.
  #8 (permalink)  
Antiguo 29/01/2015, 06:26
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: Forzar descarga zip, desesperado!!!

Y si en vez de intentar descargarlo, simplemente lo "creas" en el servidor... ¿este se crea?
__________________
>> Eleazan's Source
>> @Eleazan
  #9 (permalink)  
Antiguo 29/01/2015, 08:00
Avatar de adrirs11  
Fecha de Ingreso: diciembre-2012
Ubicación: BCN
Mensajes: 107
Antigüedad: 11 años, 3 meses
Puntos: 1
Respuesta: Forzar descarga zip, desesperado!!!

Pues no se como se hace...supongo que quieres decir que lo guarde especificandole una ruta en el servidor.
  #10 (permalink)  
Antiguo 29/01/2015, 08:15
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: Forzar descarga zip, desesperado!!!

Sí,

O bien, solo vuelcalo a la pantalla (quitando headers), verás muchas cosas raras, pero sabrás si funciona o no la parte del Zip ;)
__________________
>> Eleazan's Source
>> @Eleazan
  #11 (permalink)  
Antiguo 29/01/2015, 08:46
Avatar de adrirs11  
Fecha de Ingreso: diciembre-2012
Ubicación: BCN
Mensajes: 107
Antigüedad: 11 años, 3 meses
Puntos: 1
Respuesta: Forzar descarga zip, desesperado!!!

La cosa es que yo al php que genera el zip y lo descarga lo llamo desde jquery con la funcion ajax...Gracias a ti Eleazan, se me ha ocurrido ir devolviendo echos al ajax linia a linea para ver si petaba, el caso es que ahora me devuelve:

Cannot modify header information

Ya es salgo vamos avanzando, alguna idea?

PD: se queja de:

header("Content-Length: ".filesize($nombre));
header('Content-disposition: attachment; filename='.$nombre);
header('Content-type: application/zip');
  #12 (permalink)  
Antiguo 29/01/2015, 08:57
Avatar de adrirs11  
Fecha de Ingreso: diciembre-2012
Ubicación: BCN
Mensajes: 107
Antigüedad: 11 años, 3 meses
Puntos: 1
Respuesta: Forzar descarga zip, desesperado!!!

He buscado y no se deben hacer echos antes de modificar el header....entonces he borrado los echo y solo hago un alert del resultado desde ajax y todo va perfecto...no se queja de nada pero no descarga el zip!
  #13 (permalink)  
Antiguo 29/01/2015, 09:25
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: Forzar descarga zip, desesperado!!!

Si lo haces por ajax, con chrome, por ejemplo, al F12, abres la consola....

Y si te vas a network, y filtras por "XHR" (ajax!), verás tu petición (sea get o post!). Ahí podrás ver que response te da y todo

De todas todas formas... por ajax NO te descargará el fichero :/
__________________
>> Eleazan's Source
>> @Eleazan
  #14 (permalink)  
Antiguo 29/01/2015, 09:48
Avatar de adrirs11  
Fecha de Ingreso: diciembre-2012
Ubicación: BCN
Mensajes: 107
Antigüedad: 11 años, 3 meses
Puntos: 1
Respuesta: Forzar descarga zip, desesperado!!!

Pues vaya, entonces ... podria llamar desde html a una página php pasandole por parámetros variables javascript???
  #15 (permalink)  
Antiguo 29/01/2015, 09:51
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: Forzar descarga zip, desesperado!!!

Cita:
Iniciado por adrirs11 Ver Mensaje
Pues vaya, entonces ... podria llamar desde html a una página php pasandole por parámetros variables javascript???
O abrir un popup...

Si quieres, para hacer pruebas hazlas a "piñon", ej:


Código HTML:
Ver original
  1. <a href="aqui_genero_el_zip.php">Generar!</a>

Si este se genera bien, se deberia descargar... ;)
__________________
>> Eleazan's Source
>> @Eleazan
  #16 (permalink)  
Antiguo 29/01/2015, 09:56
Avatar de adrirs11  
Fecha de Ingreso: diciembre-2012
Ubicación: BCN
Mensajes: 107
Antigüedad: 11 años, 3 meses
Puntos: 1
Respuesta: Forzar descarga zip, desesperado!!!

Ya pero el principal problema es que el php tiene que recibir dos arrays y tres variables numericas...y estos valores se encuentran en javascript...y si no puedo pasar las variables por ajax...no tengo ni idea de como hacerlo.
  #17 (permalink)  
Antiguo 30/01/2015, 02:54
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: Forzar descarga zip, desesperado!!!

Nada, olvidate de ese problema ahora mismo. Mete esas variables "a piñón" en el php, que no tengas que pasarle nada...

Y comprueba si te genera el zip. Una vez que consigas ese paso, ya mirarás como pasar las variables por ajax (o por get), que ambas cosas son posibles ;)
__________________
>> Eleazan's Source
>> @Eleazan

Etiquetas: 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 20:46.