Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Forzar la descarga de archivos comprimidos

Estas en el tema de Forzar la descarga de archivos comprimidos en el foro de PHP en Foros del Web. Hola a tod@s necesito su valiosa ayuda con este problema, tengo esta función @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original function downloadZipFile ( $fileUrl ) { ...
  #1 (permalink)  
Antiguo 06/11/2013, 08:34
Avatar de tquezada  
Fecha de Ingreso: febrero-2013
Ubicación: Santiago
Mensajes: 196
Antigüedad: 11 años, 9 meses
Puntos: 8
Forzar la descarga de archivos comprimidos

Hola a tod@s necesito su valiosa ayuda con este problema,
tengo esta función
Código PHP:
Ver original
  1. function downloadZipFile($fileUrl){
  2.  
  3.     $fileContent = file_get_contents($fileUrl);
  4.     $compressed = gzencode($fileContent, 9);
  5.     $fileSize = mb_strlen($compressed);
  6.  
  7.     // download file
  8.     $ctype="application/octet-stream";
  9.     header("Pragma: public");
  10.     header("Expires: 0");
  11.     header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  12.     header("Cache-Control: private",false);
  13.     header("Content-Type: $ctype");
  14.     header("Content-Disposition: attachment; filename=\"".basename($fileUrl).".gz\";" );
  15.     header("Content-Transfer-Encoding: binary");
  16.     header("Content-Length: ".$fileSize);
  17.     echo $compressed;
  18.     exit();
  19. }

esta función me sirve para agregar un archivo, comprimirlo y forzar su descarga
pero yo necesito agregar mas de un archivo

ojala me puedan ayudar.

Saludos
__________________
¿Sabes cuántos programadores hacen falta para cambiar una bombilla? - no, no ¿Cuántos? - Ninguno... es un problema de hardware.
  #2 (permalink)  
Antiguo 06/11/2013, 08:43
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 13 años, 2 meses
Puntos: 397
Respuesta: Forzar la descarga de archivos comprimidos

Mira este aporte de @abimaelrc te facilitará mucho las cosas (aunque al principio dice que solo permite extraer si revisas después dice que puede añadir archivos)

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #3 (permalink)  
Antiguo 06/11/2013, 09:14
Avatar de tquezada  
Fecha de Ingreso: febrero-2013
Ubicación: Santiago
Mensajes: 196
Antigüedad: 11 años, 9 meses
Puntos: 8
Respuesta: Forzar la descarga de archivos comprimidos

gracias amigo por la respuesta pero buscando y buscando y probando y probando descubrí esta solución

Primero crear un archivo con el nombre de "zipfile.php" por ejemplo
con esto:
Código PHP:
Ver original
  1. <?
  2. class zip{
  3.    var $datasec = array();
  4.    var $ctrl_dir = array();
  5.    var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
  6.    var $old_offset = 0;
  7.  
  8.    function add_dir($name) {
  9.       $name = str_replace("", "/", $name);
  10.  
  11.       $fr = "\x50\x4b\x03\x04";
  12.       $fr .= "\x0a\x00";
  13.       $fr .= "\x00\x00";
  14.       $fr .= "\x00\x00";
  15.       $fr .= "\x00\x00\x00\x00";
  16.  
  17.       $fr .= pack("V",0);
  18.       $fr .= pack("V",0);
  19.       $fr .= pack("V",0);
  20.       $fr .= pack("v", strlen($name) );
  21.       $fr .= pack("v", 0 );
  22.       $fr .= $name;
  23.       $fr .= pack("V", 0);
  24.       $fr .= pack("V", 0);
  25.       $fr .= pack("V", 0);
  26.  
  27.       $this -> datasec[] = $fr;
  28.       $new_offset = strlen(implode("", $this->datasec));
  29.  
  30.       $cdrec = "\x50\x4b\x01\x02";
  31.       $cdrec .="\x00\x00";
  32.       $cdrec .="\x0a\x00";
  33.       $cdrec .="\x00\x00";
  34.       $cdrec .="\x00\x00";
  35.       $cdrec .="\x00\x00\x00\x00";
  36.       $cdrec .= pack("V",0);
  37.       $cdrec .= pack("V",0);
  38.       $cdrec .= pack("V",0);
  39.       $cdrec .= pack("v", strlen($name) );
  40.       $cdrec .= pack("v", 0 );
  41.       $cdrec .= pack("v", 0 );
  42.       $cdrec .= pack("v", 0 );
  43.       $cdrec .= pack("v", 0 );
  44.       $ext = "\x00\x00\x10\x00";
  45.       $ext = "\xff\xff\xff\xff";
  46.       $cdrec .= pack("V", 16 );
  47.       $cdrec .= pack("V", $this -> old_offset );
  48.       $cdrec .= $name;
  49.  
  50.       $this -> ctrl_dir[] = $cdrec;
  51.       $this -> old_offset = $new_offset;
  52.       return;
  53.    }
  54.  
  55.    function add_fileFromString($data,$name){
  56.       $name = str_replace("", "/", $name);
  57.       $unc_len = strlen($data);
  58.       $crc = crc32($data);
  59.       $zdata = gzcompress($data);
  60.       $zdata = substr ($zdata, 2, -4);
  61.       $c_len = strlen($zdata);
  62.       $fr = "\x50\x4b\x03\x04";
  63.       $fr .= "\x14\x00";
  64.       $fr .= "\x00\x00";
  65.       $fr .= "\x08\x00";
  66.       $fr .= "\x00\x00\x00\x00";
  67.       $fr .= pack("V",$crc);
  68.       $fr .= pack("V",$c_len);
  69.       $fr .= pack("V",$unc_len);
  70.       $fr .= pack("v", strlen($name) );
  71.       $fr .= pack("v", 0 );
  72.       $fr .= $name;
  73.       $fr .= $zdata;
  74.       $fr .= pack("V",$crc);
  75.       $fr .= pack("V",$c_len);
  76.       $fr .= pack("V",$unc_len);
  77.  
  78.       $this -> datasec[] = $fr;
  79.       $new_offset = strlen(implode("", $this->datasec));
  80.  
  81.       $cdrec = "\x50\x4b\x01\x02";
  82.       $cdrec .="\x00\x00";
  83.       $cdrec .="\x14\x00";
  84.       $cdrec .="\x00\x00";
  85.       $cdrec .="\x08\x00";
  86.       $cdrec .="\x00\x00\x00\x00";
  87.       $cdrec .= pack("V",$crc);
  88.       $cdrec .= pack("V",$c_len);
  89.       $cdrec .= pack("V",$unc_len);
  90.       $cdrec .= pack("v", strlen($name) );
  91.       $cdrec .= pack("v", 0 );
  92.       $cdrec .= pack("v", 0 );
  93.       $cdrec .= pack("v", 0 );
  94.       $cdrec .= pack("v", 0 );
  95.       $cdrec .= pack("V", 32 );
  96.       $cdrec .= pack("V", $this -> old_offset );
  97.  
  98.       $this -> old_offset = $new_offset;
  99.  
  100.       $cdrec .= $name;
  101.       $this -> ctrl_dir[] = $cdrec;
  102.    }
  103.    
  104.    function add_file($data, $name) {
  105.       $fp = fopen($data,"r");
  106.       $data = fread($fp,filesize($data));
  107.       fclose($fp);
  108.       $name = str_replace("", "/", $name);
  109.       $unc_len = strlen($data);
  110.       $crc = crc32($data);
  111.       $zdata = gzcompress($data);
  112.       $zdata = substr ($zdata, 2, -4);
  113.       $c_len = strlen($zdata);
  114.       $fr = "\x50\x4b\x03\x04";
  115.       $fr .= "\x14\x00";
  116.       $fr .= "\x00\x00";
  117.       $fr .= "\x08\x00";
  118.       $fr .= "\x00\x00\x00\x00";
  119.       $fr .= pack("V",$crc);
  120.       $fr .= pack("V",$c_len);
  121.       $fr .= pack("V",$unc_len);
  122.       $fr .= pack("v", strlen($name) );
  123.       $fr .= pack("v", 0 );
  124.       $fr .= $name;
  125.       $fr .= $zdata;
  126.       $fr .= pack("V",$crc);
  127.       $fr .= pack("V",$c_len);
  128.       $fr .= pack("V",$unc_len);
  129.  
  130.       $this -> datasec[] = $fr;
  131.       $new_offset = strlen(implode("", $this->datasec));
  132.  
  133.       $cdrec = "\x50\x4b\x01\x02";
  134.       $cdrec .="\x00\x00";
  135.       $cdrec .="\x14\x00";
  136.       $cdrec .="\x00\x00";
  137.       $cdrec .="\x08\x00";
  138.       $cdrec .="\x00\x00\x00\x00";
  139.       $cdrec .= pack("V",$crc);
  140.       $cdrec .= pack("V",$c_len);
  141.       $cdrec .= pack("V",$unc_len);
  142.       $cdrec .= pack("v", strlen($name) );
  143.       $cdrec .= pack("v", 0 );
  144.       $cdrec .= pack("v", 0 );
  145.       $cdrec .= pack("v", 0 );
  146.       $cdrec .= pack("v", 0 );
  147.       $cdrec .= pack("V", 32 );
  148.       $cdrec .= pack("V", $this -> old_offset );
  149.  
  150.       $this -> old_offset = $new_offset;
  151.  
  152.       $cdrec .= $name;
  153.       $this -> ctrl_dir[] = $cdrec;
  154.    }
  155.  
  156.    function file() {
  157.       $data = implode("", $this -> datasec);
  158.       $ctrldir = implode("", $this -> ctrl_dir);
  159.  
  160.       return
  161.       $data .
  162.       $ctrldir .
  163.       $this -> eof_ctrl_dir .
  164.       pack("v", sizeof($this -> ctrl_dir)) .
  165.       pack("v", sizeof($this -> ctrl_dir)) .
  166.       pack("V", strlen($ctrldir)) .
  167.       pack("V", strlen($data)) .
  168.       "\x00\x00";
  169.    }
  170. }
  171. ?>
luego en nuestro script agregar esto
Código PHP:
Ver original
  1. include("zipfile.php");
  2. $zip = new zip();
  3.  
  4. $zip->add_dir("imagenes"); //aca se crea una carpeta donde se guardan los archivos
  5.  
  6. //primero la ruta de la imagen,carpeta/nombre de la foto
  7. $zip->add_file("/images/foto2.jpg","imagenes/foto.jpg");
  8. $zip->add_file("/images/foto3.jpg","imagenes/foto2.jpg");
  9.  
  10. header("Content-type: application/force-download");
  11. header("Content-Transfer-Encoding: Binary");
  12. header("Content-length: ".strlen($zip->file()));
  13. header("Content-Type: application/octet-stream");
  14. header("Content-Disposition: attachment; filename=\"nombre_del_zip{$format}.zip\"");
  15.  
  16. echo $zip->file();

con eso se forzara la descarga espero que a alguien le sirva
Saludos.
__________________
¿Sabes cuántos programadores hacen falta para cambiar una bombilla? - no, no ¿Cuántos? - Ninguno... es un problema de hardware.

Etiquetas: Ninguno
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 21:47.